2012-08-10 14 views
5

Si trato de filtrar en un campo en un objeto relacionado, entonces Tastypie devuelve un error. Por ejemplo, correr¿Cómo se filtra un campo en un objeto relacionado?

curl -H "Accept: application/json" \ 
    "http://localhost:8080/wordgame/api/v1/rounds/?format=json&players__username=moe" 

devuelve "Las búsquedas no se permiten más de un nivel de profundidad en el campo 'de los jugadores." En esencia, yo estoy tratando de hacer lo que puedo hacer actualmente en la cáscara de Django:

Round.objects.all().filter(players__username=moe.username) 

estoy usando el siguiente código, que he simplificado por razones de brevedad:

# wordgame/api.py which has tastypie resources 
class RoundResource(ModelResource): 
    players = fields.ManyToManyField(UserResource, 'players',full=True) 
    . . . 

    class Meta: 
     queryset = Round.objects.all() 
     resource_name = 'rounds' 
     filtering = { 
      'players': ALL, 
     } 

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'players' 
     filtering = { 
      'username': ALL, 
     } 

# wordgame/models.py which has Django models 
class Round(models.Model): 
    players = models.ManyToManyField(User) 
    word = models.CharField(max_length=75) 
    . . . 

Estoy asumiendo que ya UserResource define un filtro en el campo 'nombre de usuario' que debería funcionar, pero no es así. Incluso intenté agregar "players__username" al filtro en RoundResource, sin embargo, esto tampoco funcionó.

He leído sobre basic filtering in the docs y miré el código en GitHub sin embargo, no parece haber nada para esto. También eché un vistazo al advanced filtering documentation y no parece ajustarse a mi caso de uso. He visto el código de Tastypie en GitHub pero no lo entiendo lo suficiente como para descubrir si 1) estoy haciendo esto mal, o 2) qué anular para que funcione.

+0

Supongo que 'ManyToManyField' es un error tipográfico; [los documentos de Tastypie] (http://django-tastypie.readthedocs.org/en/latest/fields.html) lo tienen como 'fields.ToManyField' – supervacuo

+0

@supervacuo ManyToMany es compatible con la versión actual como una subclase de ToManyField. Puede encontrarlo en GitHub [aquí] (https://github.com/toastdriven/django-tastypie/blob/master/tastypie/fields.py#L768). –

+0

Ah, es suficiente. – supervacuo

Respuesta

11

Al parecer, tiene que específicamente lista blanca las operaciones de búsqueda de relaciones que abarca en su línea filtering, así:

class UserResource(ModelResource): 
    class Meta: 
     queryset = User.objects.all() 
     resource_name = 'players' 
     filtering = { 
      'username': ALL_WITH_RELATIONS, 
     } 

Al menos, yo creo que es el lugar adecuado para decirlo. El relevant docs es bastante delgado en ejemplos. Un boleto de Tastypie, sin embargo, suggests this should work.

+0

Gracias! Cambiar 'ALL' a 'ALL_WITH_RELATIONS' en la clase RoundResource funcionó. Ahora puedo filtrar las rondas por nombre de usuario. Un poco más de doc, o tal vez un mejor ojo (de mi parte), se habría dado cuenta de esto. –

Cuestiones relacionadas