2012-07-02 14 views
5

Moja strona Django ma model Zdjęcie, które reprezentuje zdjęcia w systemie i używam Django.contrib.comments, aby umożliwić użytkownikom komentowanie tych. Wszystko działa dobrze, ale chciałbym rozszerzyć mój interfejs API Tastypie, aby umożliwić dostęp do komentarzy do mojego PhotoResource przy użyciu adresu URL, takiego jak /api/v1/photo/1/comments, gdzie 1 to identyfikator zdjęcia. Mogę sprawić, by adres URL działał dobrze, ale niezależnie od tego, jaki rodzaj filtrowania robię, zawsze wydaje mi się, że zwracam cały zestaw komentarzy, a nie tylko zestaw dla dostarczonego zdjęcia. Podaję ściętego wybór mojego aktualnego kodu API poniżej:Wracając komentarze Django do zasobu Tastypie

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)) 

O ile mogę powiedzieć, że jest to filtr w ostatnim wierszu, który nie działa. Myślę, że jest to nieco skomplikowane ze względu na contrib.com, używając ContentTypes do linkowania do komentowanego obiektu, co wydaje mi się możliwe, że Tastypie nie może sobie z tym poradzić. Próbowałem kilku wariacji na ten temat, ale nadal nie działa. Czułem, że coś takiego będzie działać:

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) 

, ale wszystkie komentarze zostały zwrócone.

Czy ktoś ma jakieś pomysły, jak to zrobić (a może nawet jest to możliwe)?

+0

Czy go rozwiązać? Jeśli tak, w jaki sposób? – silviomoreto

Odpowiedz

1

Zwykle zamiast włamać się do PhotoResource, zamiast tego zrobiłbym filtrowanie w CommentResource. Musisz włączyć filtrowanie dla tego modelu oraz adres URL będzie wyglądać następująco:

/api/v1/komentarz/object__pk = 1 & content_type_id = 2

+0

Yup, rozważałem zrobienie czegoś takiego, ale dla mnie to naprawdę nie tworzy dobrego adresu URL. Nigdy nie interesują mnie same komentarze, tylko komentarze związane ze zdjęciem, dlatego wolę, aby URL był w formacie '/ photo/1/comments'. Poczyniłem pewne postępy w tej sprawie, zanim zacząłem je analizować, więc mam nadzieję, że wkrótce będę mógł podzielić się swoimi wynikami. – Roarster

+0

Hej @Roarster, mam do czynienia z tym samym problemem, jesteśmy w stanie go rozwiązać ?! – noahandthewhale

+1

Niestety nie. W efekcie porzuciłem Tastypie i użyłem [Django REST Framework] (http://django-rest-framework.org/). Tastypie było bardzo łatwe do przejścia, ale naprawdę walczyłem, kiedy potrzebowałem czegoś poza zwykłymi. DRF sprawiło, że było to o wiele łatwiejsze, chociaż potrzeba było trochę więcej pracy, aby zacząć. Wydaje się również, że jest nieco bardziej aktywny po stronie rozwoju, co jest dobre. – Roarster

Powiązane problemy