我正在尝试使用可调用创建一个带有选择字段的模型,以便 Django 在选择列表更改时不会创建迁移,如中所述this https://stackoverflow.com/questions/31788450/stop-django-from-creating-migrations-if-the-list-of-choices-of-a-field-changes问题在这里。
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
where
SEVERITY_CHOICES = (
(1, 'Low'),
(2, 'Medium'),
(3, 'High'),
)
但是,我收到一条错误消息:
quoting.Quote.severity: (fields.E004) 'choices' must be an iterable (e.g., a list or tuple).
我认为你混淆了choices
论点Model
场,并且在forms.ChoiceField
场地。在一个model https://docs.djangoproject.com/en/1.8/ref/models/fields/#choices, choices
必须是可交互的 - 你不能传递可调用的:
choices
:一个可迭代对象(例如列表或元组),由以下可迭代对象组成
正好有两个项目(例如 [(A, B), (A, B) ...])用作选择
这个领域。
Your get_severity_choices
类未被识别为可迭代对象,因为 Django 希望它能够子类化collections.Iterable https://docs.python.org/2/library/collections.html#collections.Iterable而不是仅仅暴露一个__iter__
method.
You can pass 可调用的 https://docs.djangoproject.com/en/1.8/ref/forms/fields/#django.forms.ChoiceField.choices to a FormField
:
choices
:用作该字段的选择的二元组的可迭代(例如,列表或元组),或者返回此类可迭代的可调用。
For a Model
字段,但是您必须事先指定您的选择。还来自文档:
注意choices
可以是任何可迭代对象——不一定是列表
或元组。这使您可以动态地构建选择。但如果你发现
自己黑客攻击choices
保持活力,你的情况可能会更好
使用带有外键的正确数据库表。choices
是为了
静态数据不会发生太大变化(如果有的话)。
至于为什么 Django 创建看似无用的迁移,有一些讨论这张票 https://code.djangoproject.com/ticket/22837:
这是设计使然。有几个原因,其中最重要的是......历史上某个时刻的数据迁移需要有一个完整的
模型的准确表示,包括它们的所有选项,而不是
只是那些影响数据库的内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)