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



在对此问题的评论中,我问如何删除具有默认值函数的字段。总而言之,示例代码为:

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删除了 功能。我可以手动编辑迁移,这是可以的 这种情况,但是如果您简单地更改了默认函数,并且 想要删除旧功能吗?

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

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

遵循历史模型的文档:

引用字段选项中的功能,例如upload_tolimit_choices_to和具有use_in_migrations = True经理的模型管理器声明,在迁移中序列化,因此,只要有迁移参考,就需要将功能和类保持在迁移中。他们。任何自定义模型字段也都需要保留,因为这些字段是通过迁移直接导入的。

.....

要删除旧的引用,您可以壁球迁移或,如果参考不多,将它们复制到迁移文件

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

  1. 南瓜迁移 - 如果您不再需要这些
  2. 编辑迁移文件:将功能复制到迁移文件,并在迁移中编辑引用。

从注释中更新:

编辑迁移文件的步骤2中,我仅包括文档中描述的方式。您的编辑如何确切地是您的选择。您可以在迁移文件中复制函数并编辑参考文献,也可以只能从迁移文件中删除默认字段,也可以使用其他文件中的另一个函数。

看起来您几乎自己找出了答案。在删除get_deadline功能之前,必须将其从使用它的任何迁移中删除。有两种方法:

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

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

我认为同时删除这两者(即"在另一个"中)不是不是正确的方法。而是:

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

  • 确认什么都没有使用该函数。

  • 在修订n m(即,以后的修订版)中删除未使用的函数。

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

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

然后再次做python

$manage.py makemigrations
$python manage.py migrate

最新更新