Django Rest Framework-CreateAPIView ForeignKey查找字段

时间:2019-02-09 06:18:56

标签: python django django-models django-rest-framework

我正在使用Django Rest Framework CreateAPIView来创建注释。到目前为止,一切正常,这是我的代码。

模型

class Posts(models.Model):
    title = models.CharField(max_length=512, null=True)
    slug = models.CharField(max_length=512, null=True)

class Comments(models.Model):
    post = models.ForeignKey(Posts, on_delete=models.CASCADE)
    content = models.CharField(max_length=5000, null=True)

序列化器

class CommentCreateSerializer(ModelSerializer):

    class Meta:
        model = Comments
        fields = [
            'content',
            'post'
        ]

并查看

class CommentCreateView(CreateAPIView):
    permission_classes = [IsAuthenticated]
    queryset = Comments.objects.all()
    serializer_class = CommentCreateSerializer


我使用post(ID)content向创建路由发送了发布请求,一切正常。但是问题是我想传递帖子slug而不是帖子ID。

我不确定该怎么做。我对lookup_fields很熟悉,但是我不确定如何将它们应用于ForeignKey匹配。

2 个答案:

答案 0 :(得分:2)

当您在评论创建中传递CommentCreateSerializer值时,可以使用post中的SlugRelatedField来使用 slug 而不是 pk 请求,例如:

class CommentCreateSerializer(ModelSerializer):
    post = serializers.SlugRelatedField(
        queryset=Posts.objects.all(), slug_field='slug'
    )

    class Meta:
        model = Comments
        fields = [
            'content',
            'post'
        ]

答案 1 :(得分:1)

在CommentAPI视图中,您需要像这样将perform create方法覆盖到查找中

def perform_create(self):
    post_pk = self.kwargs.get("post_pk")
    post  = get_object_or_404(Post, pk=post_pk)
    serializer.save(post=post)