Python 处理函数django模型字段默认值的最佳方法是什么?

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

有时,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)
在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')
    ...
现在,迁移工作如预期的那样,我们可以使用我们喜欢的任何功能为外键字段提供默认对象