2010-05-17 4 views
75

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.Django: Définir une clé étrangère en utilisant un nombre entier?

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

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 la flexibilité d'avoir des types d'employés illimités, mais il y aura probablement que dans l'application déployée une type unique, donc je me demande s'il existe un moyen de coder en dur l'ID et définir la relation de cette façon. De cette façon, je peux éviter un appel db pour obtenir l'objet EmployeeType en premier.

Répondre

171

Yep:

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

ForeignKey champs stocker leur valeur dans un attribut avec _id à la fin, que vous pouvez accéder directement à é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 en temps lorsque cela est approprié.

mise en garde:

@RuneKaagaard souligne que employee.type est pas après précise ces dernières versions de Django, même après avoir appelé employee.save() (elle détient son ancienne valeur). L'utiliser irait bien sûr à l'encontre du but de l'optimisation ci-dessus, mais je préférerais qu'une requête supplémentaire accidentelle soit incorrecte. Alors soyez prudent, n'utilisez ceci que lorsque vous avez fini de travailler sur votre instance (par exemple employee).

+7

Est-ce documenté? –

+0

[modèle '.save()'] (https://github.com/django/django/blob/731f313d604a6cc141f36d8a1ba9a75790c70154/django/db/models/base.py#L708) utilise le champ 'attname' ([' pre_save () 'renvoie la valeur' attname'] (https://github.com/django/django/blob/master/django/db/models/fields/__init__.py#L602)). Pour ForeignKeys, 'attname' est le nom avec le suffixe' _id'. En outre, l'attribut 'foobar_id' d'une instance de modèle est [mis à jour automatiquement] (https://github.com/django/django/blob/master/django/db/models/fields/related.py#L467) lorsque vous définissez 'foobar'. Mais où est-il officiellement documenté? –

+5

En utilisant directement les valeurs des clés étrangères: https://docs.djangoproject.com/fr/1.8/topics/db/optimization/#use-foreign-key-values-directly –

28

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

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