Wie bereits in der Antwort von @ gareth angedeutet , idist es möglicherweise nicht immer die beste Idee, einen Standardwert fest zu codieren :
Wenn der idWert nicht in der Datenbank vorhanden ist, treten Probleme auf. Selbst wenn dieser bestimmte idWert vorhanden ist, kann sich das entsprechende Objekt ändern. In jedem Fall müssten idSie 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 uniqueanderen 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.titleFeld verwendet, um ein eindeutiges Objekt abzurufen, und ein Exam.descriptionFeld zeigt, wie wir das defaultsArgument (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 ForeignKeydieses, die Modellinstanzen zugeordnet sind, sollten Standardwerte der Wert des Felds sein, auf das sie verweisen ( pksofern nicht to_fieldfestgelegt), anstatt Modellinstanzen.
Beachten Sie auch, dass defaultCallables 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 .