Django REST Framework中如何将story_media序列化器字段设为非必填?
解决Django Rest Framework中嵌套字段必填问题
嘿,我看你遇到的问题其实是嵌套序列化器的常见坑,主要有两个点导致你的设置不生效,咱们一步步来修复:
1. 首先修正序列化器的字段声明
你之前只在extra_kwargs里设置required=False,但对于嵌套的ModelSerializer字段来说,这个设置有时候不会覆盖它的默认规则(嵌套字段默认是必填的)。咱们直接在字段定义时明确标记为可选:
class StoryCreateUpdateSerializer (serializers.ModelSerializer): # 直接在这里添加 required=False 和 allow_null=True,让字段明确可选 story_media = Story_Media_Serializer(many=True, required=False, allow_null=True) class Meta: model = Story fields = ('title','description', 'place', 'audio','story_media', 'language', ) # 这里的extra_kwargs可以删掉了,因为已经在字段声明里明确设置了 # extra_kwargs = {'story_media': {'required': False}}
2. 修复create方法的KeyError问题
你原来的代码里用validated_data.pop('story_media'),如果前端没传这个字段,validated_data里根本没有这个键,直接pop会抛出KeyError。换成get方法,给个默认的空数组就能解决:
def create(self, validated_data): current_user = self.context["request"].user # 用get获取字段,不存在就返回空数组,避免报错 story_media = validated_data.get('story_media', []) story_instance = Story.objects.create(author=current_user, **validated_data) # 循环处理媒体内容,空数组的话就不会执行创建逻辑 for img in story_media: # 加个判断避免空对象导致的异常 if img: Story_Media.objects.create(**img, story=story_instance) return story_instance
为什么原来的设置不生效?
简单来说,DRF对于嵌套序列化器字段的优先级是:字段声明时的参数 > Meta里的extra_kwargs > 模型字段的设置。你之前只在extra_kwargs里设置,没覆盖嵌套字段的默认必填规则,所以才会依然报错。
现在这样修改后,不管前端是完全不传story_media字段,还是传一个空数组,都能正常创建Story对象,不会再触发必填错误啦。
内容的提问来源于stack exchange,提问作者dan_boy
相关产品推荐
相关产品推荐

