用户没有保存在多对多字段 drf

问题描述 投票:0回答:1

我正在学习 django rest 框架,我的

users
模型中有一个名为
Blog
的字段,带有 ManyToManyFieldUser,我正在尝试在
.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' 对象不可迭代” }

python django django-rest-framework django-serializer
1个回答
0
投票

你应该使用

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)
代替。

© www.soinside.com 2019 - 2024. All rights reserved.