Django 迁移错误:错误:“选择”必须是可迭代的(例如,列表或元组)

Posted

技术标签:

【中文标题】Django 迁移错误:错误:“选择”必须是可迭代的(例如,列表或元组)【英文标题】:Django Migration Error: ERRORS: 'choices' must be an iterable (e.g., a list or tuple) 【发布时间】:2018-04-02 23:54:46 【问题描述】:

我已经为博客应用程序创建了模型。这是我的models.py:

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
# Create your models here.
class post(models.Model):
    STATUS_CHOICE=(
        ('draft','DRAFT'),
        ('published','Published'),
    )

    title=models.CharField(max_length=250)
    slug=models.SlugField(max_length = 250,unique_for_date='publish')
    author=models.ForeignKey(User,related_name='blog_posts')
    body=models.TextField()
    publish=models.DateTimeField(default=timezone.now)
    created = models.DateTimeField(auto_now_add=True)
    updated=models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10,
                                choices = 'STATUS_CHOICES',
                                    default='draft')
    class Meta:
        ordering = ('-publish',)
    def __str__(self):
        return self.title

当我尝试迁移模型时出现错误:

ERRORS:
myblog.post.status: (fields.E004) 'choices' must be an iterable (e.g., a list or tuple).

这是我的 admin.py 文件:

from django.contrib import admin
from .models import post

# Register your models here.
admin.site.register(post)

谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

请删除

中 STATUS CHOICES 中的引号
status = models.CharField(max_length=10,
                        choices = 'STATUS_CHOICES',
                            default='draft')

到:

status = models.CharField(max_length=10,
                        choices = STATUS_CHOICE,
                            default='draft')

【讨论】:

但现在我在使用命令 python manage,py makemigrations 时出现错误:您正在尝试添加一个不可为空的字段“作者”以在没有默认值的情况下发布;我们不能这样做(数据库需要一些东西来填充现有的行)。请选择一个修复:1)现在提供一次性默认值(将在所有现有行上设置此列的空值)2)退出,让我在 models.py 中添加默认值 选择一个选项 不是错误...请仔细阅读。这将是对您的数据库表进行的操作...为该字段指定默认值或继续使用它...【参考方案2】:

choices 需要引用您在上面声明的列表,而不是字符串:

status = models.CharField(max_length=10,
                            choices = STATUS_CHOICE,
                                default='draft')

【讨论】:

微妙的错误:STATUS_CHOICES 在 OPs 代码中不仅错误为字符串,而且还声明为 STATUS_CHOICE

以上是关于Django 迁移错误:错误:“选择”必须是可迭代的(例如,列表或元组)的主要内容,如果未能解决你的问题,请参考以下文章

ValueError: `sequences` 在 Keras 中必须是可迭代的

空视图上的Django rest框架错误:必须先呈现响应内容,然后才能对其进行迭代

Django-Memsql 初始迁移错误

Django中的迭代错误

带有架构的 MSSQL 数据库的 Django 迁移错误

运行 make 迁移时出现 Django 关系错误