select_related relations querysets queryset queries practices optimize create best django optimization django-models foreign-keys

relations - Django: ¿Establecer clave foránea usando enteros?



model relations django (2)

¿Hay alguna manera de establecer una relación de clave externa usando el ID entero de un modelo? Esto sería para fines de optimización.

Por ejemplo, supongamos que tengo un modelo de empleado:

class Employee(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) type = models.ForeignKey(''EmployeeType'')

y

EmployeeType(models.Model): type = models.CharField(max_length=100)

Quiero la flexibilidad de tener tipos ilimitados de empleados, pero en la aplicación desplegada probablemente solo habrá un solo tipo, así que me pregunto si hay una forma de codificar el ID y establecer la relación de esta manera. De esta forma puedo evitar una llamada a db para obtener primero el objeto EmployeeType.


Sí:

employee = Employee(first_name="Name", last_name="Name") employee.type_id = 4 employee.save()

ForeignKey campos ForeignKey almacenan su valor en un atributo con _id al final, al que puede acceder directamente para evitar visitar la base de datos.

La versión _id de ForeignKey es un aspecto particularmente útil de Django, que todos deberían conocer y usar de vez en cuando cuando corresponda.

advertencia:

@RuneKaagaard señala que employee.type no es exacto después en versiones recientes de Django, incluso después de llamar a employee.save() (mantiene su valor anterior). Usarlo, por supuesto, vencería el propósito de la optimización anterior, pero preferiría que una consulta extra accidental fuera incorrecta. Así que tenga cuidado, solo use esto cuando termine de trabajar en su instancia (por ejemplo, employee ).


Una alternativa que utiliza create para crear el objeto y guardarlo en la base de datos en una línea:

employee = Employee.objects.create(first_name=''first'', last_name=''last'', type_id=4)