【问题标题】:Returning Django comments for a Tastypie resource返回 Tastypie 资源的 Django 注释
【发布时间】:2012-07-02 22:37:38
【问题描述】:

我的 Django 网站有一个 Photo 模型,它代表系统中的照片,我使用 Django.contrib.comments 来允许用户评论这些照片。这一切工作正常,但我想扩展我的 Tastypie API 以允许使用像 /api/v1/photo/1/comments 这样的 URL 访问我的 PhotoResource 的 cmets,其中 1 是照片的 ID。我能够使 URL 正常工作,但无论我在做什么类型的过滤,我似乎总是返回完整的 cmets 集,而不仅仅是提供的照片集。我在下面包含了我当前代码 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.cmets 使用 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)

但是所有的 cmets 都被退回了。

有没有人知道如何做到这一点(或者如果可能的话)?

【问题讨论】:

  • 你解决了吗?如果是,怎么做?

标签: django tastypie django-comments


【解决方案1】:

通常我不会将其入侵到 PhotoResource 中,而是在 CommentResource 中进行过滤。您必须为该模型启用过滤,并且 url 看起来像这样:

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

【讨论】:

  • 是的,我考虑过做类似的事情,但对我来说,这并不是一个好的 URL。我对 cme​​ts 本身不感兴趣,只对与照片相关的 cmets 感兴趣,这就是为什么我希望 URL 采用 /photo/1/comments 格式的原因。在被转移之前,我确实在这方面取得了一些进展,所以希望我能尽快分享我的结果。
  • 嘿@Roarster,我也遇到了同样的问题,你能解决吗?!
  • 很遗憾没有。我最终放弃了 Tastypie 并改用Django REST Framework。 Tastypie 很容易上手,但当我需要一些与众不同的东西时,我真的很挣扎。 DRF 使这变得容易了很多,尽管它确实需要更多的工作才能开始。它似乎在开发方面也更加活跃,这很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 2012-09-09
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
相关资源
最近更新 更多