web-dev-qa-db-de.com

Django: Fremdschlüssel mit Integer setzen?

Gibt es eine Möglichkeit, eine Fremdschlüsselbeziehung mithilfe der Ganzzahl-ID eines Modells festzulegen? Dies wäre zu Optimierungszwecken.

Angenommen, ich habe ein Mitarbeitermodell:

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, unbegrenzt viele Mitarbeitertypen zu haben, aber in der bereitgestellten Anwendung wird es wahrscheinlich nur einen einzigen Typ geben. Daher 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 abzurufen.

90
User

Ja:

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, auf das Sie direkt zugreifen können, um den Besuch der Datenbank zu vermeiden.

Die _id - Version eines ForeignKey ist ein besonders nützlicher Aspekt von Django, den jeder bei Bedarf von Zeit zu Zeit kennen und verwenden sollte.

Einschränkung:

@RuneKaagaard weist darauf hin, dass employee.type In den letzten Django) Versionen nicht mehr korrekt ist, auch wenn employee.save() aufgerufen wurde (es behält seinen alten Wert) natürlich den Zweck der obigen Optimierung zunichte machen, aber ich würde es vorziehen, wenn eine zufällige zusätzliche Abfrage nicht korrekt ist. Seien Sie also vorsichtig, verwenden Sie diese nur, wenn Sie mit der Arbeit an Ihrer Instanz fertig sind (z. B. employee).

187
Will Hardy

Eine Alternative, die create verwendet, um das Objekt zu erstellen und in einer Zeile in der Datenbank zu speichern:

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