Wie bereits in der Antwort von @ gareth angedeutet , id
ist es möglicherweise nicht immer die beste Idee, einen Standardwert fest zu codieren :
Wenn der id
Wert nicht in der Datenbank vorhanden ist, treten Probleme auf. Selbst wenn dieser bestimmte id
Wert vorhanden ist, kann sich das entsprechende Objekt ändern. In jedem Fall müssten id
Sie bei Verwendung eines fest codierten Werts auf Datenmigrationen oder die manuelle Bearbeitung vorhandener Datenbankinhalte zurückgreifen.
Um dies zu verhindern, können Sie get_or_create () in Kombination mit einem unique
anderen Feld als verwenden id
.
So würde ich es machen:
from django.db import models
class Exam(models.Model):
title = models.CharField(max_length=255, unique=True)
description = models.CharField(max_length=255)
@classmethod
def get_default_pk(cls):
exam, created = cls.objects.get_or_create(
title='default exam', defaults=dict(description='this is not an exam'))
return exam.pk
class Student(models.Model):
exam_taken = models.ForeignKey(to=Exam, on_delete=models.CASCADE,
default=Exam.get_default_pk)
Hier wird ein Exam.title
Feld verwendet, um ein eindeutiges Objekt abzurufen, und ein Exam.description
Feld zeigt, wie wir das defaults
Argument (for get_or_create
) verwenden können, um das Standardobjekt vollständig anzugeben Exam
.
Beachten Sie, dass wir a zurückgeben pk
, wie in den Dokumenten vorgeschlagen :
Für Felder wie ForeignKey
dieses, die Modellinstanzen zugeordnet sind, sollten Standardwerte der Wert des Felds sein, auf das sie verweisen ( pk
sofern nicht to_field
festgelegt), anstatt Modellinstanzen.
Beachten Sie auch, dass default
Callables in Model.__init__()
( Quelle ) ausgewertet werden . Wenn Ihr Standardwert also von einem anderen Feld desselben Modells oder vom Anforderungskontext oder vom Status des clientseitigen Formulars abhängt, sollten Sie wahrscheinlich woanders suchen .