На моем сайте 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)
но снова все комментарии были возвращены.
У кого-нибудь есть идеи, как это сделать (или если это вообще возможно)?