在Django Tastypie中删除对象

3

我有以下模型:

class Poster(models.Model)
     user = models.OneToOneField(User, primary=True)
     userpicture = models.CharField(max_length = 128 =True)

class Posts(models.Model)
     poster = models.ForeignKey(Poster, related_name = 'post_owner')
     url = models.CharField(max_length = 128)
     time = models.DateTimeField(auto_now_add=True)

class Comment(models.Model):
     user = models.ForeignKey(Poster)
     post = models.ForeignKey(Posts)
     time = models.DateTimeField(auto_now_add=True)
     comment = models.CharField(max_length=140)

一个用户可以发表文章,其他用户可以在该文章下评论,有点像博客的工作方式。我希望让文章所有者有权删除他自己的评论以及其他用户在他的文章下的评论。

我应该如何实现这个功能呢?

我目前正在使用 Django Tastypie。这是我的当前资源:

class DeleteComment(ModelResource):
     class Meta:
          queryset = Comment.objects.all()
          allowed_methods = ['delete']
          resource_name = 'comment-delete'
          excludes = ['id', 'comment', 'post', 'time']
          authorization = Authorization()
          authentication = BasicAuthentication()
          include_resource_uri = False
          always_return_data = True

这个可以工作!但是,它允许任何用户删除任何评论,即使不是他们自己的评论,这是不好的!怎么办呢?
只需向以下地址发送DELETE请求:myapp.com:8000/v1/posts/comment-delete/8/,它将删除id为8的Comment对象。这就是设置失败的地方。
我需要一种方法,只有帖子所有者才能删除他在帖子上发表的评论以及其他人的评论。
2个回答

3

这可以通过授权最好地实现。

你需要实现delete_detail方法来返回True或False,例如:

def delete_detail(self, object_list, bundle):
    return bundle.obj.user == bundle.request.user

很明显,但需要明确说明,因为一开始我似乎没有意识到这一点, 如果返回 True,则对象将在 obj_delete 方法中被删除。 如果返回 False,则对象不会在 obj_delete 方法中被删除。obj_delete 方法用于实际删除对象,delete_detail 决定是否要删除。 - Nick Brady

2

tastyie cookbook中所解释的那样。也许你可以像这样做:

class DeleteComment(ModelResource):

    def obj_delete(self, bundle, **kwargs):
         # get post id
         comment = Comment.objects.get(pk=bundle.data.id) # or or whatever way you can get the id
         # delete all comments with that post id
         Comment.objects.filter(post=comment.post).delete()
         return super(DeleteComment, self).obj_delete(bundle, user=bundle.request.user)

    def apply_authorization_limits(self, request, object_list):
        return object_list.filter(user=request.user)

这会考虑到其他发布者创建的评论对象被删除吗? - deadlock
我尝试了你的解决方案,发表评论的用户无法删除他的评论 :( - deadlock
直接删除该帖子即可,这样评论也会被删除。 - dan-klasson
我知道删除帖子会删除所有相关评论,但我想避免这种情况。我的问题是是否有一种方法可以在不删除帖子的情况下删除评论。发帖人可以删除自己的评论以及其他发帖人在他的帖子上的评论。这样做的原因是,如果帖子所有者在评论中犯了错误或其他发帖人在他的帖子上写了令人不悦的内容,他可以轻松地将它们删除。 - deadlock
1
也许尝试使用 bundle.obj.pk?检查一下 bundle,你会找到它的。 - dan-klasson
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接