没有主键的情况下如何进行PUT请求?

时间:2019-09-09 07:24:37

标签: python django django-rest-framework

我正在使用DRF为博客创建Like / Dislike api。我有一个包含“ Post”,“ User”和“ isLike”字段的Like表。由于Django无法使用复合键,因此我将unique_together约束用于(“ Post”和“ User”)。

如果用户喜欢帖子,则在“喜欢”表中创建一个条目。现在,如果用户想要从帖子中删除他的喜欢或不喜欢该帖子,那么我需要这些(PUT / DELETE)方法的“喜欢”表中的输入主键。因为我知道“用户”和“发布”,并且两者都是唯一的,所以我可以使用唯一的字段执行(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"),)

在“喜欢”表中创建条目的视图:

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 /更新喜欢/不喜欢,但我想使用“发布”和“用户”详细信息来完成。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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视图试图用post_user更新def get_object(来自LikeDislikeSerializer),并且是否请求此带有DELETE方法的URL,视图将删除来自def get_object的对象。希望帮助