有时,ForeignKey字段需要默认值。例如:
class ReleaseManager(BaseManager):
def default(self):
return self.filter(default=True).order_by('-modified').first()
class Release(BaseModel):
default = models.BooleanField(default=False)
...
class Server(models.Model):
...
release = models.ForeignKey(Release, null=True, default=Release.objects.default)
上述代码一切顺利,直到数据库迁移,因此默认函数无法序列化,因此函数默认会导致大问题。手动迁移可以解决这个问题,但是在一个大型项目中,定期迁移可能squashed,这会给那些粗心大意留下定时炸弹。
一个常见的解决方法是将默认值从字段移动到模型的save方法,但如果模型被rest framework之类的东西使用,或者在创建预期默认值的表单中,则会导致混淆。字段。
答案 0 :(得分:0)
我目前最喜欢的解决方法适用于迁移以及其余框架和其他表单生成。它假定对象管理器提供了一个默认方法,并使用一个专门的ForeignKey字段来获取它:
class ForeignKeyWithObjectManagerDefault(models.ForeignKey):
def __init__(self, to, **kwargs):
super().__init__(to, **kwargs)
self.to = to
def get_default(self):
return self.to.objects.default().pk
class Project(SOSAdminObject):
primary = ForeignKeyWithObjectManagerDefault(Primary, related_name='projects')
...
现在迁移按预期工作,我们可以使用我们喜欢的任何功能为外键字段提供默认对象。