You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django使用Postgres ArrayField搭配带choices的CharField时出现选项无效报错

问题原因

你提交的数组中第一个值"Acamedic"存在拼写错误,你定义的可选值中对应正确值为"Academic",d与m的顺序写反,因此触发了选项校验失败的报错。


其他可能的问题排查

如果修正拼写后依然遇到同类报错,可按以下方向排查:

  • 确认所有提交的数组元素都严格匹配BOOK_CATEGORY中每一项的第一个值(即存储值,你当前配置的存储值和展示值完全一致,无需额外调整,若后续两者配置不同,注意传存储值而非展示值)
  • 如果你使用Django REST Framework做接口接收参数,需要手动指定序列化器的字段类型,不能直接依赖自动生成的序列化规则,示例配置如下:
from rest_framework import serializers
from .models import Book

class BookSerializer(serializers.ModelSerializer):
    category = serializers.ListField(
        child=serializers.ChoiceField(choices=BOOK_CATEGORY),
        allow_empty=True,
        required=False
    )
    
    class Meta:
        model = Book
        fields = "__all__"
  • 如果你使用的Django版本低于3.2,ArrayField对内嵌字段的choices校验存在已知兼容问题,可以改用自定义校验器实现校验逻辑,示例如下:
from django.core.exceptions import ValidationError
from django.db import models
from django.contrib.postgres.fields import ArrayField

BOOK_CATEGORY = (
    ("Academic", "Academic"),
    ("Science Fiction", "Science Fiction"),
    ("For Student", "For Student"),
    ("Others", "Others"),
)

def validate_category_items(value):
    allowed_values = {item[0] for item in BOOK_CATEGORY}
    for item in value:
        if item not in allowed_values:
            raise ValidationError(f"「{item}」不在可用选项范围内")

class Book(models.Model):
    category = ArrayField(
        models.CharField(max_length=100), 
        blank=True, 
        null=True,
        validators=[validate_category_items]
    )

内容的提问来源于stack exchange,提问作者user10031694

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 17:24:04