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
相关产品推荐
相关产品推荐

