2010-05-17 17 views
75

Gibt es eine Möglichkeit Fremdschlüsselbeziehung mit der Ganzzahl-ID eines Modells zu setzen? Dies wäre zu Optimierungszwecken.Django: Fremdschlüssel mit Ganzzahl setzen?

Zum Beispiel nehme ich an ein Mitarbeitermodell haben:

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

und

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

Ich möchte die Flexibilität unbegrenzte Mitarbeiter Arten aufweisen, aber in der bereitgestellten Anwendung wird es wahrscheinlich nur eine sein single type, also frage ich mich, ob es eine Möglichkeit gibt, die ID fest zu codieren und die Beziehung auf diese Weise festzulegen. Auf diese Weise kann ich einen DB-Aufruf vermeiden, um das EmployeeType-Objekt zuerst zu erhalten.

Antwort

171

Yep:

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

ForeignKey Felder speichern ihren Wert in einem Attribut mit _id am Ende, die Sie direkt auf die Datenbank zu besuchen vermeiden zugreifen können.

Die _id Version eines ForeignKey ist ein besonders nützlicher Aspekt von Django, den jeder von Zeit zu Zeit kennen und anwenden sollte, wenn es angebracht ist.

Einschränkung:

@RuneKaagaard weist darauf hin, dass employee.type nicht genau danach in der letzten Django-Versionen, auch nach employee.save() Aufruf (es seinen alten Wert hält). Die Verwendung würde natürlich den Zweck der obigen Optimierung zunichtemachen, aber ich würde eine versehentliche zusätzliche Abfrage als inkorrekt ansehen. Seien Sie vorsichtig, verwenden Sie dies nur, wenn Sie mit der Bearbeitung Ihrer Instanz fertig sind (z. B. employee).

+7

dies dokumentiert ist? –

+0

[Modell '.save()'] (https://github.com/django/django/blob/731f313d604a6cc141f36d8a1ba9a75790c70154/django/db/models/base.py#L708) verwendet das Feld 'attname' ([' pre_save () 'gibt den' attname' Wert] (https://github.com/django/django/blob/master/django/db/models/fields/__init__.py#L602)). Für ForeignKeys ist 'attname' der Name mit dem Suffix _id. Auch die 'foobar_id' Attribut eines Modells Instanz [automatisch aktualisiert] (https://github.com/django/django/blob/master/django/db/models/fields/related.py#L467), wenn Sie eingestellt 'Foobar'. Aber wo ist es offiziell dokumentiert? –

+5

direkt Fremdschlüsselwerte verwenden: https://docs.djangoproject.com/en/1.8/topics/db/optimization/#use-foreign-key-values-directly –

28

Eine Alternative, die create nutzt das Objekt zu erstellen und sie in die Datenbank in einer Zeile speichern:

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