首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >防止用户在Django API中喜欢自己的评论

防止用户在Django API中喜欢自己的评论
EN

Stack Overflow用户
提问于 2021-02-23 17:57:44
回答 3查看 91关注 0票数 0

我希望有人能帮助解决这个问题。我相信答案可能很简单,但我就是摸不着头脑。我正在创建一个消息传递API,用户喜欢评论,但是我想防止用户喜欢自己的评论

我有以下链接到消息模型的Like模型:

代码语言:javascript
复制
# models.py

class Like(models.Model):
    message_id = models.ForeignKey(Message, related_name='message_id_like', on_delete=models.CASCADE)
    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    like = models.BooleanField()
    like_date = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return str(self.owner) + ', ' + self.message_id.message_title[:40]

使用API的序列化程序

代码语言:javascript
复制
# serializers.py

class LikeSerializer(serializers.ModelSerializer):
    owner = serializers.ReadOnlyField(source='owner.username')
    class Meta:
        model = Like
        fields = [
            'message_id',
            'owner',
            'like',
            'like_date',
            ]

和一个视图:

代码语言:javascript
复制
# views.py

class LikeViewSet(viewsets.ModelViewSet): 
    queryset = Like.objects.all()
    serializer_class = LikeSerializer

    def perform_create(self, serializer): # Saving the user
        serializer.save(owner=self.request.user)

我认为我需要在LikeViewSet类中添加一个函数,以防止在like user匹配消息user时创建Like,然而,我不知道如何指定它。

感谢您的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-25 15:56:43

最终使用提交的答案的变体解决了这个问题。避免序列化程序访问错误的秘诀是初始_数据方法(而不是已验证的_拉回错误数据的数据方法)。

代码语言:javascript
复制
def perform_create(self, serializer): 
    message = get_object_or_404(Message, pk=serializer.initial_data['message_id'])
    if message.owner == self.request.user:
        raise PermissionDenied
    else:
        serializer.save(owner=self.request.user)
票数 0
EN

Stack Overflow用户

发布于 2021-02-23 18:10:07

做这样的事情。但是预防意味着很多。是显示一些错误还是默默阻止。

代码语言:javascript
复制
def perform_create(self, serializer): # Saving the user
    if serializer.data['message_id'].user == self.request.user:
        # error handle for self like
    else:
        serializer.save(owner=self.request.user)
票数 1
EN

Stack Overflow用户

发布于 2021-02-23 19:38:47

由于您使用的是Django Rest框架,因此最优雅的方法是编写一个自定义的

权限Permission Class。它可能看起来像这样:

代码语言:javascript
复制
class IsNotOwnerCanLike(permissions.BasePermission):

    def has_permission(self, request, view):
        if view.action == "create":
            return not request.data["message_id"].user == request.user

然后在ViewSet中指定

代码语言:js
复制
permission_classes = [IsNotOwnerCanLike]

这样,当所有者尝试点赞他们自己的帖子时,他们将得到一个HTTP403禁止的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66330893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档