web-dev-qa-db-fra.com

Django: définir une clé étrangère en utilisant un entier?

Existe-t-il un moyen de définir une relation de clé étrangère en utilisant l'ID entier d'un modèle? Ce serait à des fins d'optimisation.

Par exemple, supposons que j'ai un modèle Employee:

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

et

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

Je veux avoir la flexibilité d'avoir des types d'employés illimités, mais dans l'application déployée, il n'y aura probablement qu'un seul type, donc je me demande s'il existe un moyen de coder en dur l'ID et de définir la relation de cette façon. De cette façon, je peux éviter un appel db pour obtenir d'abord l'objet EmployeeType.

90
User

Oui:

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

Les champs ForeignKey stockent leur valeur dans un attribut avec _id à la fin, auquel vous pouvez accéder directement pour éviter de visiter la base de données.

La version _id D'un ForeignKey est un aspect particulièrement utile de Django, que tout le monde devrait connaître et utiliser de temps à autre, le cas échéant.

mise en garde:

@RuneKaagaard souligne que employee.type N'est pas précis par la suite dans les versions récentes Django, même après avoir appelé employee.save() (il conserve son ancienne valeur). bien sûr, cela va à l'encontre du but de l'optimisation ci-dessus, mais je préférerais qu'une requête supplémentaire accidentelle soit incorrecte. Soyez donc prudent, utilisez-la uniquement lorsque vous avez terminé de travailler sur votre instance (par exemple employee).

187
Will Hardy

Une alternative qui utilise create pour créer l'objet et l'enregistrer dans la base de données sur une seule ligne:

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