繁体   English   中英

Django在选择列表更改时创建无意义的迁移

[英]Django creates pointless migrations on choices list change

我正在尝试使用可调用对象来创建带有选项字段的模型,以便当选项列表更改时,Django不会创建迁移,如问题所述。

class Quote(models.Model):
    severity = models.IntegerField(choices=get_severity_choices)
    ...

class get_severity_choices(object):
    def __iter__(self):
        for item in SEVERITY_CHOICES:
            yield item

哪里

SEVERITY_CHOICES = (
    (1, 'Low'),
    (2, 'Medium'),
    (3, 'High'),
)

但是,我收到一条错误消息:

quoting.Quote.severity: (fields.E004) 'choices' must be an iterable (e.g., a list or tuple).

我认为您在Model字段和forms.ChoiceField字段上混合了choices参数。 模型中choices必须是可交互的-您不能传递可调用对象:

choices :一个可迭代的(例如列表或元组)本身由恰好两个项目(例如[[(A,B),(A,B)...])的可迭代项组成,用作此字段的选择。

您的get_severity_choices类未被认为是可迭代的,因为Django希望它get_severity_choices collections.Iterable子类。可迭代而不是仅公开__iter__方法。

可以可调用对象传递给FormField

choices :要么是一个2元组的可迭代(例如,列表或元组)用作此字段的选择,要么是返回此类迭代的可调用对象。

但是,对于“ Model字段,您必须事先指定选择。 另外从文档:

请注意, choices可以是任何可迭代的对象-不一定是列表或元组。 这使您可以动态构造选择。 但是,如果您发现黑客的choices是动态的,那么最好使用带有ForeignKey的正确数据库表。 choices是针对不变的静态数据(如果有的话)。

关于Django为什么创建看似无用的迁移的原因, 此票证对此进行了一些讨论:

这是设计使然。 原因有很多,其中不仅仅如此……历史上的各个点的数据迁移都需要对模型进行完全准确的表示,包括它们的所有选项,而不仅仅是影响数据库的那些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM