Django: externe sleutel instellen met integer?

Is er een manier om de externe-sleutelrelatie in te stellen met behulp van de integer-id van een model? Dit zou voor optimalisatiedoeleinden zijn.

Stel bijvoorbeeld dat ik een werknemersmodel heb:

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

en

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

Ik wil de flexibiliteit van een onbeperkt aantal typen werknemers, maar in de geïmplementeerde applicatie zal er waarschijnlijk maar één type zijn, dus ik vraag me af of er een manier is om de id hard te coderen en de relatie op deze manier in te stellen. Op deze manier kan ik een db-aanroep vermijden om het EmployeeType-object eerst te krijgen.


Antwoord 1, autoriteit 100%

Ja:

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

ForeignKey-velden slaan hun waarde op in een attribuut met _idaan het einde, waartoe u direct toegang hebt om te voorkomen dat u de database hoeft te bezoeken.

De _id-versie van een ForeignKeyis een bijzonder nuttig aspect van Django, een dat iedereen zou moeten kennen en van tijd tot tijd moeten gebruiken wanneer dat nodig is.

waarschuwing:[ < Django 2.1 ]

@RuneKaagaard wijst erop dat employee.typeachteraf niet accuraat is in recente Django-versies, zelfs niet na het aanroepen van employee.save()(het behoudt zijn oude waarde). Het gebruik ervan zou natuurlijk het doel van de bovenstaande optimalisatie teniet doen, maar ik heb liever dat een toevallige extra zoekopdracht onjuist is. Wees dus voorzichtig, gebruik dit alleen als u klaar bent met het werken aan uw instantie (bijv. employee).

Opmerking: zoals @humcat hieronder aangeeft, is de bug opgelost in Django 2.1


Antwoord 2, autoriteit 23%

Een alternatief dat gebruikmaakt van createom het object te maken en op één regel in de database op te slaan:

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

Other episodes