Django Rest Framework 来自前端的多对多字段数据

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

模型.py

class PostCategory(models.Model):
    name = models.CharField(max_length=200, unique=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class Post(models.Model):
    title = models.CharField(max_length=255)
    user = models.ForeignKey(User, on_delete=models.DO_NOTHING)
    content = models.TextField()
    post_categories = models.ManyToManyField(PostCategory, blank=True)

    def __str__(self):
        return self.title

序列化器.py

class PostSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())

    class Meta:
        model = Post
        exclude = []
        
    def create(self, validated_data):
        # Retrieve the currently logged-in user
        user = self.context['request'].user
        
        # Add the author user to the validated data
        validated_data['user'] = user

        # Create and return the Post instance
        post = Post.objects.create(**validated_data)
        return post

views.py

class PostCreateView(APIView):
    def post(self, request):
        if request.user.is_authenticated:
            serializer = PostSerializer(data = request.data, context={'request': request})
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

通过POST方法从前端传递数据

FormData(3) { title → "Title 1", content → "Content 1", post_categories → "web framework,javascript"}

我正在使用 Django REST Framework 并尝试实现多对多关系。我正在将数据从前端发送到 drf 后端。现在我面临的错误是:

post_categories [“类型错误。预期pk值,收到str。” ]

这是显而易见的。我相信错误是正确的,但我不知道如何修复它。我还认为一旦解决这个问题我将面临另一个错误:

禁止直接分配到多对多集的前向端。使用 post_categories.set() 代替。

所以我也想知道如何解决这个问题。请帮忙。

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

您遇到的错误“类型不正确。预期的 pk 值,收到的字符串。”是因为您发送的是帖子类别的字符串表示形式(“web 框架,javascript”),而不是类别的主键值创建 Post 实例时。您需要修改从前端发送数据的方式以包含所选类别的主键。

要解决此问题,您可以进行以下更改:

前端

从前端发送数据时,您应该发送代表所选类别的主键(PK)数组,而不是字符串

{
  "title": "Title 1",
  "content": "Content 1",
  "post_categories": [1, 2]  // Replace 1 and 2 with the actual PKs of selected categories
}

DRF 串行器:

更新您的 PostSerializer 以接受 post_categories 字段的主键列表:

class PostSerializer(serializers.ModelSerializer):
    user = serializers.PrimaryKeyRelatedField(read_only=True, default=serializers.CurrentUserDefault())
    post_categories = serializers.PrimaryKeyRelatedField(many=True, queryset=PostCategory.objects.all())  # Add this line

    class Meta:
        model = Post
        exclude = []

    def create(self, validated_data):
        # Retrieve the currently logged-in user
        user = self.context['request'].user

        # Add the author user to the validated data
        validated_data['user'] = user

        # Create and return the Post instance
        post = Post.objects.create(**validated_data)
        return post

serializers.PrimaryKeyRelatedField(many=True, queryset=PostCategory.objects.all()) 行允许您接受 post_categories 字段的主键数组。

通过这些更改,您的 DRF 视图应该能够正确接受来自前端的数据,并且您不会遇到“类型错误”错误。另外,保存Post实例时,将正确建立与post_categories的多对多关系,无需直接赋值。

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