Возврат комментариев Django для ресурса Tastypie

На моем сайте Django есть модель Photo, которая представляет фотографии в системе, и я использую Django.contrib.comments, чтобы пользователи могли их комментировать. Все это работает нормально, но я хотел бы расширить свой Tastypie API, чтобы разрешить доступ к комментариям для моего PhotoResource с использованием URL-адреса, такого как /api/v1/photo/1/comments, где 1 — это идентификатор фотографии. Я могу заставить URL-адрес работать нормально, но независимо от того, какую фильтрацию я выполняю, я всегда возвращаю полный набор комментариев, а не только набор для предоставленной фотографии. Я включил сокращенный выбор моего текущего кода 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)

но снова все комментарии были возвращены.

У кого-нибудь есть идеи, как это сделать (или если это вообще возможно)?


person Roarster    schedule 02.07.2012    source источник
comment
Вы решили это? Если да, то как?   -  person silviomoreto    schedule 14.11.2012


Ответы (1)


Обычно вместо того, чтобы взламывать его в PhotoResource, я вместо этого выполнял фильтрацию в CommentResource. Вы должны включить фильтрацию для этой модели, и URL-адрес будет выглядеть так:

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

person endre    schedule 24.07.2012
comment
Да, я думал сделать что-то подобное, но для меня это не очень хороший URL. Меня никогда не интересуют сами комментарии, только комментарии, связанные с фотографией, поэтому я бы предпочел, чтобы URL-адрес был в формате /photo/1/comments. Я добился некоторого прогресса в этом, прежде чем отвлекся, поэтому, надеюсь, скоро смогу поделиться своими результатами. - person Roarster; 29.07.2012
comment
Привет, @Roarster, у меня тоже такая же проблема, ты можешь ее решить?! - person deadlock; 18.12.2012
comment
К сожалению нет. В итоге я отказался от Tastypie и вместо этого использовал Django REST Framework. Tastypie было очень легко начать, но я действительно боролся, когда мне нужно было что-то необычное. DRF сделал это намного проще, хотя для начала потребовалось немного больше работы. Он также кажется более активным в плане разработки, и это хорошо. - person Roarster; 09.01.2013