2012-07-02 16 views
5

Mi sitio de Django tiene un modelo de foto que representa fotos en el sistema y estoy usando Django.contrib.comments para permitir que los usuarios comenten sobre estos. Todo está funcionando bien, pero me gustaría extender mi Tastypie API para permitir el acceso a los comentarios para mi PhotoResource usando una URL como /api/v1/photo/1/comments donde 1 es la identificación de la foto. Puedo hacer que la URL funcione bien, pero no importa qué tipo de filtrado estoy haciendo siempre parece devolver el conjunto completo de comentarios en lugar de solo el conjunto para la foto suministrada. He incluido una selección de reducir mi API de código actual a continuación:Devolución de comentarios de Django para un recurso de 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)) 

Por lo que yo puedo decir que es el filtro en la última línea que no está funcionando. Creo que esto es un poco complicado debido a contrib.comments que usan ContentTypes para vincular al objeto que se comenta sobre lo que supongo que es posible que Tastypie no pueda manejar. He intentado un montón de variaciones sobre esto, pero todavía no funciona. Me sentí bastante seguro de que algo así funcionarí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) 

pero de nuevo todos los comentarios fueron devueltos.

¿Alguien tiene alguna idea de cómo hacer esto (o si es posible)?

+0

¿Usted lo resolvió? Si es así, ¿cómo? – silviomoreto

Respuesta

1

Por lo general, en lugar de hackearlo en PhotoResource, debería filtrar en CommentResource. Tiene que habilitar el filtrado para ese modelo y la URL se vería así:?

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

+0

Sí, consideré hacer algo así, pero para mí no es una buena URL. Nunca me interesan los comentarios en sí, solo los comentarios relacionados con una foto y por eso prefiero que la URL tenga el formato '/ photo/1/comments'. Avancé un poco en esto antes de desviarme, así que espero poder compartir mis resultados pronto. – Roarster

+0

¡Hola, @Roarster, estoy enfrentando el mismo problema, podemos resolverlo! – noahandthewhale

+1

Desafortunadamente no. Terminé abandonando Tastypie y usando [Django REST Framework] (http://django-rest-framework.org/). Tastypie fue muy fácil de poner en marcha, pero realmente tuve problemas cuando necesitaba algo fuera de lo común. DRF ha hecho esto mucho más fácil, aunque tomó un poco más de trabajo para ponerse en marcha. También parece ser un poco más activo en el lado del desarrollo, que es bueno. – Roarster

Cuestiones relacionadas