Comme l'a déjà laissé entendre le commentaire de @gareth répondre en codant en dur une valeur par défaut id
n'est pas toujours la meilleure idée :
Si le id
n'existe pas dans la base de données, vous avez un problème. Même si cette valeur id
existe, l'objet correspondant peut changer. Dans tous les cas, lors de l'utilisation d'une valeur id
vous devrez recourir à des solutions telles que la migration de données ou l'édition manuelle du contenu de la base de données existante.
Pour éviter cela, vous pouvez utiliser get_ou_create() en combinaison avec un unique
(autre que id
).
Voici une façon de procéder :
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
)
Ici, un Exam.title
est utilisé pour obtenir un objet unique, et un champ Exam.description
illustre comment nous pouvons utiliser le champ defaults
(pour les get_or_create
) pour spécifier complètement la valeur par défaut de la Exam
objeto.
Notez que nous renvoyons un pk
comme le suggère la documents :
Pour les champs tels que ForeignKey
qui renvoient à des instances de modèle, les valeurs par défaut doivent être celles du champ auquel elles font référence ( pk
sauf si to_field
est défini) au lieu des instances de modèle.
Il convient également de noter que default
sont évalués en Model.__init__()
( source ). Ainsi, si votre valeur par défaut dépend d'un autre champ du même modèle, ou du contexte de la requête, ou de l'état du formulaire côté client, vous devriez probablement rechercher ailleurs .