Django为ManyToMany字段设置空列表序列化时报UUID校验错误如何解决?
报错原因
DRF的ModelSerializer默认处理多对多外键字段时,如果没有显式指定many=True,会将字段识别为单值类型。你当前的序列化器没有显式定义tagged_users字段,框架默认将其映射为单UUID字段,传入空列表时会把整个列表当做单个UUID校验,就触发了你看到的报错。
另外你当前代码里的hash_tags字段在序列化器中被设为read_only=True,你往request.data里塞的hash_tags值不会被序列化器处理,不会自动关联到Post实例上。
解决方法
第一步:修改serializer.py,显式定义关联字段属性
class PostSerializer(serializers.ModelSerializer): hash_tags = HashTagSerializer(many=True, read_only=True) # 新增显式定义tagged_users字段 tagged_users = serializers.PrimaryKeyRelatedField( many=True, queryset=User.objects.all(), allow_empty=True, # 允许空列表传入 required=False # 不传该字段也不会触发校验报错 ) class Meta: model = Post fields = ('creator', 'body', 'uuid', 'created', 'type', 'updated_at', 'hash_tags', 'tagged_users')
第二步:调整view.py逻辑,修复关联赋值问题
def request_to_post_data(request): # 先复制得到可变字典,避免直接修改默认不可变的request.data引发异常 request_data = request.data.copy() post_text = request_data['body'] # 处理hash_tags:要保留实例而不是取字符串值,后续手动关联 hash_tags_list = extract_hashtags(post_text) hash_tags = [HashTag.objects.get_or_create(hash_tag=ht)[0] for ht in hash_tags_list] # 处理tagged_users tagged_users_list = extract_usernames(post_text) tagged_users = list() for username in tagged_users_list: try: tagged_users.append(User.objects.get(username=username)) except User.DoesNotExist: pass request_data['tagged_users'] = tagged_users serializer = PostSerializer(data=request_data) if serializer.is_valid(raise_exception=True): post_obj = serializer.save() # 手动关联hash_tags post_obj.hash_tags.add(*hash_tags) create_image_models_with_post(request=request, post_obj=post_obj) create_video_models_with_post(request=request, post_obj=post_obj) return serializer
内容的提问来源于stack exchange,提问作者user12314098
相关产品推荐
相关产品推荐

