我正在使用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 /更新喜欢/不喜欢,但我想使用“发布”和“用户”详细信息来完成。
答案 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
的对象。希望帮助