2010-12-27 14 views
5

Ho un set di query che è ragionevolmente complicato, che attualmente utilizzo in un'unica vista per ottenere un elenco di oggetti.Dove mettere domande comuni su Django?

Desidero utilizzare lo stesso queryset in un paio di altre visualizzazioni ma preferirei non copiare semplicemente il codice più volte. Potrei usare un Manager, per mantenere il queryset in un posto, e usarlo in ogni vista eccetto la query si basa su una data diversa per ogni pagina.

A quanto ho capito, i gestori non ti permettono di passare in variabili ... quindi mi chiedo dove dovrei mettere questa query in modo da non continuare a ripeterla in più viste. qualche idea?

FWIW, questo è il mio set di query, e published_date è la variabile che cambia in ogni pagina:

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

risposta

8

Credo che si dovrebbe effettivamente utilizzare un Manager. Io abitualmente uso i metodi come questo nel mio manager:

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) 

Poi eseguire la query sul mio modello:

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

Naturalmente, è possibile seguire con un'altra chiamata di filtro e catena di questi o fare tutto quello che vuoi. Non c'è niente di sbagliato in questo tipo di approccio, ecco a cosa servono i manager :-).

+0

Doh, naturalmente, grazie. Sono stato espulso dalla documentazione che non suggeriva di poter passare valori alle funzioni di Manager. Avrei dovuto provarlo! –

+0

Doveva usare 'get_queryset' invece di' get_query_set'. – jozxyqk