正如@gareth的答案中已经暗示的那样,对默认id
值进行硬编码可能并不总是最好的主意:
如果该id
值在数据库中不存在,则您有麻烦。即使id
确实存在该特定值,相应的对象也可能会更改。在任何情况下,使用硬编码id
值时,都必须求助于诸如数据迁移或手动编辑现有数据库内容之类的事情。
为避免这种情况,您可以将get_or_create()与一个unique
字段结合使用(id
)。
这是我的处理方式:
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)
在这里,一个Exam.title
字段用于获取唯一对象,而一个Exam.description
字段说明了如何使用defaults
参数(for get_or_create
)来完全指定默认Exam
对象。
请注意,我们会pk
根据docs的建议返回a :
对于ForeignKey
此类映射到模型实例的字段,默认值应为它们引用的字段的值(pk
除非to_field
已设置),而不是模型实例。
另请注意,default
可调用对象在Model.__init__()
(source)中求值。因此,如果您的默认值取决于同一模型的另一个字段,请求上下文或客户端表单的状态,则可能应该在其他地方查找。