如何向Django序列化器的ManyToManyField传递多个值?
Django ManyToManyField 批量赋值问题与解决方案
问题描述
我有一个包含ManyToManyField(字段名:postSpot)的Post模型,通过Django API创建新对象时,使用FormData作为POST请求体(由ViewSet解析)。遇到以下问题:
- 当postSpot字段仅传单个值时,反序列化正常,新对象能成功创建;
- 传递多个值(如49和63)时,始终返回400 Bad Request错误。
尝试过的传递格式均无效:
- 值数组
[49,63](序列化器接收多值的常规格式) - 对象数组
[{pk:49};{pk:63}] - 单值数组
[63]
仅传递单个纯数字值时能正常工作,但设计ManyToManyField就是为了存储多值集合,求可行的传递与验证方案。
模型代码
class Post(models.Model) : postSpot = models.ManyToManyField(Spot,related_name='posts') postAuthor = models.ForeignKey(UserProfile, on_delete=models.CASCADE) postText = models.TextField(blank=True) postPicurl = models.ImageField(upload_to=post_pic_path, blank=True, null=True) postTimestamp = models.DateTimeField(blank=True, null=True) class Meta: ordering = ['-postTimestamp']
原序列化器代码
class PostSerializer(serializers.ModelSerializer): def create(self,validated_data): authorProfile = UserProfile.objects.get(user=self.context['request'].user) post = Post( postAuthor = authorProfile, postText = validated_data['postText'], postPicurl = validated_data['postPicurl'], postTimestamp = timezone.now() ) post.save(post) post.postSpot.set(validated_data['postSpot']) return post class Meta: model = Post fields = '__all__'
解决方案
- 不可直接在POST请求的
postSpot字段中传递多值,否则会被400错误拒绝; - 在请求的额外字段中传递多值数据,
postSpot字段只需传入任意有效单值; - 重写序列化器的
create方法:先创建不含多对多字段数据的新对象,再手动从请求Context中提取额外字段数据,用.add()方法逐个添加到postSpot字段。注意:即使发送数组,Context中也会是需手动解析的字符串,直接传递多个以固定前缀命名的变量(如postSpots_1、postSpots_2)并解析会更便捷。
新序列化器代码
class PostSerializer(serializers.ModelSerializer): def create(self,validated_data): authorProfile = UserProfile.objects.get(user=self.context['request'].user) post = Post( postAuthor = authorProfile, postText = validated_data['postText'], postPicurl = validated_data['postPicurl'], postTimestamp = timezone.now() ) post.save(post) for key, value in self.context['request'].POST.items(): if key[:9] == 'postSpots': post.postSpot.add(value)
内容的提问来源于stack exchange,提问作者Bol
相关产品推荐
相关产品推荐

