在对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在删除后在启动时崩溃 功能。我可以手动编辑迁移,这可以 这种情况,但如果您只是更改了默认功能,那该怎么办? 想要删除旧功能吗?
我最终删除了引用它的迁移的默认部分,但是如何很好地删除它?
我能想到的唯一方法是压缩迁移,这样使用该功能的迁移就会消失,但这并不总是一种选择。
答案 0 :(得分:6)
遵循Historical Models的文档:
对
upload_to
和limit_choices_to
等字段选项中的函数的引用以及具有use_in_migrations = True
的管理员的模型管理器声明在迁移中被序列化,因此函数和类将需要只要存在引用它们的迁移,就会被保留。还需要保留任何自定义模型字段,因为这些字段是由迁移直接导入的。.....
要删除旧引用,您可以压缩迁移,或者,如果参考文献不多,将它们复制到迁移文件。
使用方法获取default
字段选项的值与upload_to
字段的描述相同。如果要删除方法,文档本身会为您提供两个选项:
评论更新:
在编辑迁移文件的第2步中,我刚刚提供了文档中描述的方法。您可以选择如何编辑迁移。您可以在迁移文件中复制该功能并编辑引用,或者只是从迁移文件中删除默认字段,或者您可以使用其他文件中的其他功能。
答案 1 :(得分:2)
看起来你已经为自己找到了答案。在删除sudo dpkg -i python2.7-miminal*.deb
sudo dpkg -i python2.7*.deb
功能之前,必须将其从任何使用它的迁移中删除。有两种方法可以做到这一点:
get_deadline
使用其他默认值的迁移。get_deadline
。答案 2 :(得分:0)
如何在删除get_deadline函数的同时再次删除截止日期字段?
我认为同时删除这两个(即“同时”执行另一个) 是正确的方法。代替:
添加迁移以删除该字段。将该迁移部署为修订版N。
确认没有任何内容正在使用该功能。
在修订版N + M(即后期修订版)中删除未使用的功能。
这样,数据库将匹配代码的状态,因为迁移是该代码状态的一部分:当您将数据库迁移回修订版N的状态时,该函数将在那里。当您将数据库迁移到修订版N + M的状态时,您将不再需要该函数。
答案 3 :(得分:-2)
我的直接答案是删除sqlite3.db
并删除除每个应用中迁移文件夹中的__init__.py
之外的所有迁移。
然后再做python
$manage.py makemigrations
$python manage.py migrate