【问题标题】:Django Rest Framework - CreateAPIView ForeignKey lookup fieldsDjango Rest Framework - CreateAPIView ForeignKey 查找字段
【发布时间】:2019-07-03 08:48:06
【问题描述】:

我正在使用 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匹配。

【问题讨论】:

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


    【解决方案1】:

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

    class CommentCreateSerializer(ModelSerializer):
        post = serializers.SlugRelatedField(
            queryset=Posts.objects.all(), slug_field='slug'
        )
    
        class Meta:
            model = Comments
            fields = [
                'content',
                'post'
            ]
    

    【讨论】:

    • 终于有人有东西了。谢谢。
    【解决方案2】:

    在 CommentAPIview 中,您需要像这样将 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)
    

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 2019-05-22
      • 1970-01-01
      • 1970-01-01
      • 2021-09-03
      • 2013-01-15
      相关资源
      最近更新 更多