Python 处理函数django模型字段默认值的最佳方法是什么?
有时,ForeignKey字段需要默认值。例如:Python 处理函数django模型字段默认值的最佳方法是什么?,python,django,django-rest-framework,django-orm,django-migrations,Python,Django,Django Rest Framework,Django Orm,Django Migrations,有时,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 Se
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)
在db迁移之前,上面的代码一切都很好,因为默认函数无法序列化,所以函数默认值会导致大问题。手动迁移可以解决这个问题,但是在一个大型项目中,迁移可能是周期性的,这给粗心的人留下了一个定时炸弹
一种常见的解决方法是将默认值从字段移动到模型的save方法,但如果模型用于或用于创建表单,则会造成混乱,因为在这些表单中,字段上预期会出现默认值。我当前最喜欢的解决方法适用于迁移、rest框架和其他表单生成。它假定对象管理器提供默认方法,并使用专门的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')
...
现在,迁移工作如预期的那样,我们可以使用我们喜欢的任何功能为外键字段提供默认对象