2010-12-27 18 views
5

Tengo un conjunto de consulta que es razonablemente complicado, que actualmente utilizo en una vista única para obtener una lista de objetos.¿Dónde colocar consultas comunes en Django?

Quiero usar el mismo queryset en un par de otras vistas, pero preferiría no solo copiar el código varias veces. Podría usar un administrador para mantener el conjunto de consulta en un solo lugar y usarlo en cada vista , excepto, la consulta se basa en una fecha que es diferente en cada página.

Según tengo entendido, los gerentes no le permiten pasar variables ... así que me pregunto dónde debería poner esta consulta para no seguir repitiéndola en varias vistas. ¿Alguna idea?

Fwiw, esta es mi queryset y published_date es la variable que cambia en cada página:

day_publications = Publication.objects.filter(
     Q(reading__end_date__gte=published_date) | Q(reading__end_date__isnull=True), 
     reading__start_date__lte=published_date, 
).select_related('series',) 

Respuesta

8

Creo que en realidad se debe utilizar un Manager. Yo habitualmente se utilizan métodos como este en mis gerentes:

class CustomManager(models.Manager): 

    def get_records(self, city_slug, dt): 
     filter_kwargs = { 
      'city__slug': city_slug, 
      'date_from__lt': dt, 
      'date_to__gt': dt, 
     } 
     return super(CustomManager, self).get_query_set().filter(**filter_kwargs) 

Luego ejecutar la consulta en mi modelo:

MyModel.objects.get_records(city.slug, datetime.now()) 

Por supuesto, usted puede seguir con otra llamada de filtro y la cadena de estos o hago lo que quieras. No hay nada de malo en este tipo de enfoque, para eso están los gerentes :-).

+0

Doh, por supuesto, gracias. La documentación me disolvió y no sugirió que pudiera pasar valores a las funciones de administrador. ¡Debería haberlo intentado! –

+0

Tuve que usar 'get_queryset' en lugar de' get_query_set'. – jozxyqk

Cuestiones relacionadas