2016-11-29 32 views
4

在对this question answer的评论中,我询问了如何删除具有默认值函数的字段。综上所述,示例代码:如何删除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在删除 函数后崩溃。我可以手动编辑迁移,这在 这种情况下可以,但是如果您只是更改了默认功能,而 想要删除旧功能呢?

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

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

回答

4

继从Historical Models文档:

引用功能选项字段如upload_tolimit_choices_to和模型管理器的声明具有use_in_migrations = True管理者的迁徙连载,所以函数和类需要只要存在引用他们的迁移即可保留。任何自定义模型字段也都需要保留,因为这些字段是通过迁移直接导入的。

.....

要删除旧引用,您可以壁球迁移或者,如果没有很多参考资料,将它们复制到迁移文件

使用方法来获取default字段选项的值与upload_to字段中描述的相同。文档本身提供了两个选项给你,如果你想删除的方法:

  1. 壁球迁移 - 如果你不需要这些了
  2. 编辑迁移文件:复制功能迁移文件和编辑参考移民。

更新的评论:

编辑迁移文件的第2步,我刚才已经包含在文档中描述的方式。您如何编辑迁移是您的选择。您可以将该功能复制到迁移文件中并编辑参考,或者您可以从迁移文件中删除默认字段,也可以使用其他文件中的其他功能。

+0

或按照@Alasdair的回答:3.编辑迁移以使用不同的(或没有)默认 – beruic

+1

我会说这两个答案只提示两个步骤1)挤压迁移2)编辑迁移。您如何编辑迁移是您的选择。你可以复制那里的功能并编辑参考。或者,您可以从那里删除默认字段,或者您可以使用其他地方的其他功能。 :) – AKS

+0

你应该更新你的答案然后;) – beruic

0

如何在删除get_deadline函数的同时再次删除最后期限字段?

我想在同一时间(即“而”做除外)同时去除是做的正确方法。相反:

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

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

  • 在版本N + M(即,稍后的版本)中,删除未使用的函数。

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

+0

这是行不通的。该功能仍将在之前的修订中引用。 – beruic

+0

“修订”我的意思是“迁移”:) – beruic

2

看起来你几乎已经想出了自己的答案。在删除get_deadline函数之前,必须从使用它的任何迁移中删除它。有两种方法可以执行此操作:

  1. 编辑使用get_deadline来使用不同默认值的迁移。
  2. 压扁迁移以删除引用get_deadline的迁移。
+1

或按照@AKS的回答:3.将功能复制到迁移文件并编辑迁移中的参考 – beruic

-2

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

然后再做蟒蛇

$manage.py makemigrations 
$python manage.py migrate 
+0

如果我在一个实时系统上使用我无法承受的数据丢失MySQL或PostgreSQL数据库会怎么样? – beruic

+0

然后在您的实时数据编码是一个坏主意。我猜 –

+0

那么,如果不应该有可能升级实时数据,那么迁移就完全不必要了。如果您无法升级实时数据,则无法发展您的软件。 – beruic