【问题标题】:Deleting objects in django tastypie删除 django sweetpie 中的对象
【发布时间】:2013-08-16 19:24:17
【问题描述】:

我有以下型号:

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)

发帖者可以发帖,其他发帖者可以对该帖子发表评论。有点像博客的运作方式。我想让帖子所有者可以选择删除他自己的 cmets 以及他帖子上其他海报的 cmets。

我该怎么做?

我目前正在使用 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/ 即可删除 评论 id8 的strong> 对象。这是设置失败的地方。

我需要一种方法,以便只有帖子的帖子所有者才能删除他的 cmets 和他帖子上其他人的 cmets。

【问题讨论】:

    标签: python django tastypie


    【解决方案1】:

    最好使用Authorization 来执行。

    需要实现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 决定是否将其删除。
    【解决方案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)
    

    【讨论】:

    • 这会导致其他Posters创建的Comment对象被删除吗?
    • 我试过你的解决方案,发表评论的发帖人无法删除他的评论:(
    • 删除帖子。那也应该删除评论。
    • 这就是我要避免的。我知道删除帖子将删除与之关联的所有 cmets,但是我要问的是是否有办法在不删除帖子的情况下删除 cmets。发帖人可以在自己的帖子上删除自己的评论和其他发帖人的cmets。这样做的原因是,如果帖子所有者在他的评论中出错或其他海报在他的帖子上写了冒犯性的内容,他可以简单地删除它们。
    • 也许可以试试bundle.obj.pk?检查捆绑包,你会找到它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 2011-03-08
    • 2023-02-14
    • 2012-02-26
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多