python - 在 DRF 中的帖子上更新点赞
问题描述
我正在尝试在 django (DRF) 中编写一个视图,该视图允许用户在帖子上添加点赞,更新帖子上的点赞状态(喜欢/不喜欢)并删除帖子上的点赞。帖子 ID 在参数中发送,用户 ID 从身份验证令牌中提取。
我想出了如何做前两个,但我不知道如何做更新。到目前为止,这是我的观点:
class LikeView(generics.CreateAPIView, UpdateModelMixin, DestroyModelMixin):
serializer_class = LikeSerializer
queryset = Like.objects.all()
lookup_field = 'post'
permission_classes = [IsAuthenticated]
def get_object(self):
post = self.request.query_params.get('post')
user = self.request.user.id
return self.get_queryset().filter(post=post, user=user)
# retrieve user ID from token, validate data and save the like on post (working)
def post(self, request, *args, **kwargs):
data = self.get_data(request)
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response('Like has been saved')
def put(self, request, *args, **kwargs):
data = self.get_data(request)
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
serializer.save()
# working
def delete(self, request, *args, **kwargs):
return self.destroy(request, *args, **kwargs)
# add the data from param and token to a copy of the request body
# to use with the serializers
def get_data(self, request):
data = request.data.copy()
data['post'] = self.request.query_params.get('post')
data['user'] = request.user.id
return data
喜欢的型号:
class Like(models.Model):
user = ForeignKey(User, on_delete=models.CASCADE)
post = ForeignKey(Post, on_delete=models.CASCADE)
state = BooleanField(
default=True, help_text='Like = True, Dislike = False')
created_at = DateTimeField(auto_now_add=True)
updated_at = DateTimeField(auto_now=True)
def __str__(self):
state_int = int(self.state)
return ['Dislike', 'Like'][state_int]
class Meta:
unique_together = ('user', 'post')
我在这里做错了什么?缺少什么put
处理程序?
解决方案
You have missed providing instance
parameter to the serializer
in the put
method.
class LikeView(generics.CreateAPIView, UpdateModelMixin, DestroyModelMixin):
# other code
def put(self, request, *args, **kwargs):
data = self.get_data(request)
like_instance = Like.objects.get(user=request.user, post_id=int(data['post'])) # you should include 'post' while making PUT requests
serializer = self.get_serializer(instance=like_instance, data=data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response('Your response')
推荐阅读
- jms - JMS-bridge 配置不共享两个 hornetQ 服务器上的负载
- wso2 - 如何查看 wso2 api manager 4.0.0 分析数据库?
- ruby - 在 ruby 中使用正则表达式在文档中查找 url
- java - 列名上的网格按钮阴影
- angular - 如何使用 rxjs 实现去抖动?
- javascript - Nextjs - 无法在服务器端渲染上获取 url prarams(query)
- docker - 如何在不同主机上为 docker 卷权限获得一致的行为?
- eclipse - IBM Liberty 服务器在以调试模式启动后停止
- python - 在 groupby 中使用 isin
- apache-spark - Spark Shell - 系统找不到 Windows 10 中指定的路径