如何删除Django中的默认值函数

时间:2016-11-29 15:37:06

标签: django django-models django-migrations

在对this question answer的评论中,我询问了如何删除具有默认值函数的字段。总而言之,示例代码是:

def get_deadline():
    return datetime.today() + timedelta(days=20)

class Bill(models.Model):
    name = models.CharField(max_length=50)
    customer = models.ForeignKey(User, related_name='bills')
    date = models.DateField(default=datetime.today)
    deadline = models.DateField(default=get_deadline)

我对代码的问题是:

  

如何在删除时再次删除deadline字段   get_deadline功能?我删除了一个带有函数的字段   默认值,但现在Django在删除后在启动时崩溃   功能。我可以手动编辑迁移,这可以   这种情况,但如果您只是更改了默认功能,那该怎么办?   想要删除旧功能吗?

我最终删除了引用它的迁移的默认部分,但是如何很好地删除它?

我能想到的唯一方法是压缩迁移,这样使用该功能的迁移就会消失,但这并不总是一种选择。

4 个答案:

答案 0 :(得分:6)

遵循Historical Models的文档:

  

upload_tolimit_choices_to等字段选项中的函数的引用以及具有use_in_migrations = True的管理员的模型管理器声明在迁移中被序列化,因此函数和类将需要只要存在引用它们的迁移,就会被保留。还需要保留任何自定义模型字段,因为这些字段是由迁移直接导入的。

     

.....

     

要删除旧引用,您可以压缩迁移,或者,如果参考文献不多,将它们复制到迁移文件

使用方法获取default字段选项的值与upload_to字段的描述相同。如果要删除方法,文档本身会为您提供两个选项:

  1. 壁球迁移 - 如果您不再需要那些
  2. 编辑迁移文件:将功能复制到迁移文件并在迁移中编辑引用。
  3. 评论更新:

    编辑迁移文件的第2步中,我刚刚提供了文档中描述的方法。您可以选择如何编辑迁移。您可以在迁移文件中复制该功能并编辑引用,或者只是从迁移文件中删除默认字段,或者您可以使用其他文件中的其他功能。

答案 1 :(得分:2)

看起来你已经为自己找到了答案。在删除sudo dpkg -i python2.7-miminal*.deb sudo dpkg -i python2.7*.deb 功能之前,必须将其从任何使用它的迁移中删除。有两种方法可以做到这一点:

  1. 编辑使用get_deadline使用其他默认值的迁移。
  2. 压缩迁移以删除引用get_deadline
  3. 的迁移

答案 2 :(得分:0)

  

如何在删除get_deadline函数的同时再次删除截止日期字段?

我认为同时删除这两个(即“同时”执行另一个) 是正确的方法。代替:

  • 添加迁移以删除该字段。将该迁移部署为修订版N。

  • 确认没有任何内容正在使用该功能。

  • 在修订版N + M(即后期修订版)中删除未使用的功能。

这样,数据库将匹配代码的状态,因为迁移是该代码状态的一部分:当您将数据库迁移回修订版N的状态时,该函数将在那里。当您将数据库迁移到修订版N + M的状态时,您将不再需要该函数。

答案 3 :(得分:-2)

我的直接答案是删除sqlite3.db并删除除每个应用中迁移文件夹中的__init__.py之外的所有迁移。

然后再做python

$manage.py makemigrations
$python manage.py migrate