【问题标题】:How to do PUT request without primary key?如何在没有主键的情况下进行 PUT 请求?
【发布时间】:2019-09-09 07:24:37
【问题描述】:

我正在使用 DRF 为博客创建一个喜欢/不喜欢的 api。我有 Like 表,其中包含“Post”、“User”和“isLike”字段。由于 Django 不能有复合键,我使用 unique_together 约束(“Post”和“User”)。

如果用户喜欢某个帖子,我会在 Like 表中创建一个条目。现在,如果用户想从帖子中删除他的喜欢或不喜欢帖子,我需要这些(PUT/DELETE)方法的 Like 表中的条目主键。由于我知道“用户”和“发布”,并且两者都是唯一的,我可以使用唯一字段执行 (PUT/DELETE) 方法吗?

模型类

class LikeDislike(models.Model):
    """model for like counts"""
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE)
    isLike = models.BooleanField()

    class Meta:
        unique_together = (("post", "user"),)

在 Like 表中创建条目的视图:

class LikeDislikeCreateView(generics.CreateAPIView):
    queryset = models.LikeDislike.objects.all()
    serializer_class = serializers.LikeDislikeSerializer

    def perform_create(self, LikeDislikeSerializer):
        LikeDislikeSerializer.save(user=self.request.user)

我可以使用 -> /like/primary-key/ 更新喜欢/不喜欢,但我想使用“发布”和“用户”详细信息。

【问题讨论】:

  • 我删除了 sql 标签,因为问题有 unique_together/primary key 关键字,所以我包含在内,谢谢。

标签: python django django-rest-framework


【解决方案1】:

当然,您可以 - 只需在您的视图中适当地覆盖 get_object() 即可使用与 PK 不同的参数检索要修改或删除的对象。

【讨论】:

    【解决方案2】:

    我刚刚完成@AKX 答案:

    class LikeDislikeCreateUpdateDeleteView(generics.RetrieveUpdateDestroyAPIView): # generics class changed!
        queryset = models.LikeDislike.objects.all()
        serializer_class = serializers.LikeDislikeSerializer
    
        def get_object(self):
            # if you want pass post_id and user_id in url:
            post_user = get_object_or_404(LikeDislike, post_id=self.kwargs["post_id"], user_id=self.kwargs["user_id"]) 
            # if you want pass post_id and user_id in body of request:
            post_user = get_object_or_404(LikeDislike, post_id=self.request.data["post_id"], user_id=self.request.data["user_id"])
            return post_user
    
        def perform_create(self, LikeDislikeSerializer):
            LikeDislikeSerializer.save(user=self.request.user)
    

    现在,如果您使用 PUT 方法请求您的 url,LikeDislikeCreateUpdateDeleteView 视图会尝试使用 LikeDislikeSerializer 更新 post_user(来自 def get_object)。如果您使用 DELETE 方法请求此 url,视图将删除来自 def get_object 的对象。希望帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-24
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多