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 / に送信するだけで、 ID8のCommentオブジェクトが削除されます。ここでセットアップが失敗します。

投稿の所有者だけが自分のコメントと自分の投稿に対する他のユーザーのコメントを削除できるようにする方法が必要です。

4

2 に答える 2

3

これは、Authorizationで最もよく実施されます。

delete_detailTrue または False を返すメソッドを実装する必要があります。次に例を示します。

def delete_detail(self, object_list, bundle):
    return bundle.obj.user == bundle.request.user
于 2014-01-21T10:20:39.587 に答える
2

おいしいクックブックで説明されているように。多分あなたはこのようなことをすることができます:

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)
于 2013-08-16T19:50:03.877 に答える