在对此问题的评论中,我问如何删除具有默认值函数的字段。总而言之,示例代码为:
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_to
和limit_choices_to
和具有use_in_migrations = True
经理的模型管理器声明,在迁移中序列化,因此,只要有迁移参考,就需要将功能和类保持在迁移中。他们。任何自定义模型字段也都需要保留,因为这些字段是通过迁移直接导入的。.....
要删除旧的引用,您可以壁球迁移或,如果参考不多,将它们复制到迁移文件。
使用方法获取default
字段选项的值与upload_to
字段所述的值相同。如果要删除该方法,则文档本身为您提供了两个选项:
- 南瓜迁移 - 如果您不再需要这些
- 编辑迁移文件:将功能复制到迁移文件,并在迁移中编辑引用。
从注释中更新:
在编辑迁移文件的步骤2中,我仅包括文档中描述的方式。您的编辑如何确切地是您的选择。您可以在迁移文件中复制函数并编辑参考文献,也可以只能从迁移文件中删除默认字段,也可以使用其他文件中的另一个函数。
看起来您几乎自己找出了答案。在删除get_deadline
功能之前,必须将其从使用它的任何迁移中删除。有两种方法:
- 编辑使用
get_deadline
使用其他默认值的迁移。 - 挤压迁移以删除指
get_deadline
的迁移。
在同时删除get_deadline函数的同时,如何再次删除截止日期字段?
我认为同时删除这两者(即"在另一个"中)不是不是正确的方法。而是:
-
添加迁移以删除字段。将该迁移部署为修订n。
-
确认什么都没有使用该函数。
-
在修订n m(即,以后的修订版)中删除未使用的函数。
这样,数据库将与代码的状态匹配,因为迁移是该代码状态的一部分:当您将数据库迁移回到状态时,随着修订n的修订n,该函数将在那里。当您将数据库迁移到修订n M时,您将不再需要该功能。
我的直接答案将删除sqlite3.db
,并删除除每个应用程序中的迁移文件夹中的__init__.py
外的所有迁移。
然后再次做python
$manage.py makemigrations
$python manage.py migrate