5

私の Django サイトには、システム内の写真を表す Photo モデルがあり、Django.contrib.commentsユーザーがこれらにコメントできるようにするために使用しています。これはすべて正常に機能していますが、Tastypie API を拡張して、1 が写真の ID のPhotoResourceような URL を使用してコメントにアクセスできるようにしたいと考えています。/api/v1/photo/1/commentsURL を正常に機能させることはできますが、どのようなフィルタリングを行っていても、提供された写真のセットだけでなく、コメントの完全なセットを常に返すようです。現在のコード API の抜粋を以下に示します。

class CommentResource(ModelResource):
    user = fields.ForeignKey(UserResource, 'user')
    class Meta:
       queryset = Comment.objects.all()
            filtering = {
                'user': ALL_WITH_RELATIONS,
            }

class PhotoResource(ModelResource):
    user = fields.ForeignKey(UserResource, 'user')  
    class Meta:
        queryset = Photo.objects.all()
        filtering = {
            'id': 'exact',
            'user': ALL_WITH_RELATIONS
        }

    def prepend_urls(self):
        return [url(r"^(?P<resource_name>%s)/(?P<pk>\w[\w/-]*)/comments%s$" % (self._meta.resource_name, trailing_slash()), self.wrap_view('get_comments'), name="api_get_comments"),
        ]

    def get_comments(self, request, **kwargs):
        try:
            obj = self.cached_obj_get(request=request, **self.remove_api_resource_names(kwargs))
        except ObjectDoesNotExist:
            return HttpGone()
        except MultipleObjectsReturned:
            return HttpMultipleChoices("More than one resource is found at this URI.")
        comment_resource = CommentResource()
        return comment_resource.get_list(request, object_pk=obj.id, content_type=ContentType.objects.get_for_model(Photo))

私が知る限り、機能していないのは最後の行のフィルターです。contrib.comments が ContentTypes を使用してコメントされているオブジェクトにリンクしているため、これは少し複雑だと思いますが、Tastypie が対処できない可能性があると思います。これについて多くのバリエーションを試しましたが、まだ機能しません。このようなものがうまくいくと確信していました:

ctype = ContentType.objects.get_for_model(obj)
comment_resource = CommentResource()
return comment_resource.get_list(request, object_pk=obj.pk, content_type_id=ctype.id)

しかし、再びすべてのコメントが返されました。

これを行う方法を知っている人はいますか (またはそれが可能かどうか)?

4

1 に答える 1

1

通常、PhotoResourceにハッキングする代わりに、CommentResourceでフィルタリングを行います。そのモデルのフィルタリングを有効にする必要があり、URLは次のようになります。

/ api / v1 / comment /?object__pk = 1&content_type_id = 2

于 2012-07-24T15:15:54.017 に答える