我正在学习 django rest 框架,我的
users
模型中有一个名为 Blog
的字段,带有 ManyToManyField 到 User,我正在尝试在 .post()
请求中保存多个用户。
模型.py
class Blog(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=100)
users = models.ManyToManyField(User, related_name="users")
views.py
class BlogCreateView(mixins.CreateModelMixin,
GenericAPIView):
serializer_class = BlogSerializer
queryset = Blog.objects.all()
def post(self, request, pk, *args, **kwargs):
try:
return self.create(request, *args, **kwargs)
except Exception as e:
return Response({"error": "something went wrong"},)
序列化程序.py
class BlogSerializer(serializers.ModelSerializer):
users = serializers.CharField()
class Meta:
model = Blog
fields = "__all__"
def create(self, validated_data):
user_usernames = validated_data.pop('users', [])
blog = Blog.objects.create(**validated_data)
users = User.objects.filter(username__in=user_usernames)
blog.users.set(users)
return blog
当我传递像“user1”、“user2”这样的用户名字符串时,它没有保存。
然后我想也许传递用户名字符串可能是反模式然后我尝试将 CharField 转换为 ListField 就像
users = serializers.ListField(child=serializers.CharField())
但后来它显示了
{ “错误”:“'ManyRelatedManager' 对象不可迭代” }
你应该使用
set()
方法来设置 Blog
实例的用户关系,所以:
class BlogSerializer(serializers.ModelSerializer):
users = serializers.ListField(child=serializers.CharField())
class Meta:
model = Blog
fields = "__all__"
def create(self, validated_data):
user_usernames = validated_data.pop('users', [])
blog = Blog.objects.create(**validated_data)
users = User.objects.filter(username__in=user_usernames)
blog.users.set(users)
return blog
你还应该
filter()
用户名而不是实例所以它应该是 User.objects.filter(username__in=user_usernames)
代替。