![](/img/trans.png)
[英]Stop Django from creating migrations if the list of choices of a field changes
[英]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.