2012-07-11 22 views
15

Tenía una pregunta simple sobre el filtrado en tastypie.Filtrado de Tastypie con valores múltiples

Quiero filtrar con valores múltiples. Por ejemplo:

/api/v1/message/?accountId=1,5,12

Esto no funciona. Alguna idea de como puedo hacer esto?

¿Debo utilizar el filtrado avanzado? En caso afirmativo, ¿cómo hago para crear dicho filtro? Un simple ejemplo sin esfuerzo de código puesdo sería genial.

Gracias!

Respuesta

19

Hmm,

Usted puede hacer esto:

/api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12

PS: en el filtrado de atributos meta, añadir {'accountId': ALL}

+0

Gracias esto funciona :) pero va a hacer que la url sea realmente larga. ¿Hay alguna forma de que pueda hacer esto de forma más ordenada en caso de que necesite filtrar muchos identificadores de cuenta? – nknj

+0

Pago 'prepend_urls()' –

+0

¿esto no sobrescribe el parámetro GET anterior? – Amyth

8

Vas a tener que construir y aplicar un filtro. He aquí un pequeño fragmento, que es mejor para construir el filtro en build_filters, luego aplicarlo en apply_filters, pero usted consigue la idea

class Foo(ModelResource): 

    # regular stuff goes here... 

    def apply_filters(self, request, applicable_filters): 
     base_object_list = super(Foo, self).apply_filters(request, applicable_filters) 
     query = request.GET.get('query', None) 
     ids = request.GET.get('ids', None) 
     filters = {} 
     if ids: 
      ids = ids.replace('+', ' ').split(' ') 
      filters.update(dict(id__in=ids)) 
     if query: 
      qset = (
       Q(title__icontains=query, **filters) | 
       Q(description__icontains=query, **filters) 
      ) 
      base_object_list = base_object_list.filter(qset).distinct() 
     return base_object_list.filter(**filters).distinct() 
+0

Gracias por su ayuda. Me está costando entender cómo funcionaría esto. ¿Hay algo más que esto: http: //django-tastypie.readthedocs.org/en/latest/resources.html#advanced-filtering en los documentos sabrosos para ayudar con esto? – nknj

8

La versión más reciente parece que funciona bastante fácil - sólo tiene que utilizar un "__in" :

/api/v1/message/?accountId__in=1,5,12 

(supongo que tendrá una entrada en sus recursos de clase Meta, filtrado = { 'accountId': ALL})

0

debe declarar el filtrado columnas en clase Meta. Esta es una regla de seguridad por obscura regla.

Por lo tanto, accountId__in = [..] regla es uno de estos.

`` ` filtrado = { 'accountId': ALL} O filtrado = { 'accountId': [..., 'en']}

` ``

1

/api/v1/message/?accountId__in=1,5,12
esta es la forma correcta para mí, es fácil y directo.

/api/v1/message/?accountId__in=1&accountId__in=5&accountId__in=12
esta forma es extraña y se ve fea.

, por supuesto, necesita agregar filtering = { 'accountId' : ALL } en el recurso META.

Cuestiones relacionadas