2010-12-27 3 views
5

J'ai un jeu de requête raisonnablement compliqué, que j'utilise actuellement dans une seule vue pour obtenir une liste d'objets.Où mettre des requêtes communes dans Django?

Je souhaite utiliser le même jeu de requête dans plusieurs autres vues, mais je préfère ne pas simplement copier le code plusieurs fois. Je pourrais utiliser un gestionnaire, pour garder le jeu de queues dans un endroit, et l'utiliser dans chaque vue sauf la requête repose sur une date qui est différente sur chaque page. Si je comprends bien, les gestionnaires ne vous laissent pas passer des variables ... donc je me demande où je devrais mettre cette requête pour ne pas la répéter dans plusieurs vues. Des pensées?

FWIW, ceci est mon queryset et published_date est la variable qui change sur chaque page:

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

Répondre

8

Je pense que vous devriez vraiment utiliser un gestionnaire. J'utilise habituellement des méthodes comme celle-ci dans mes gestionnaires:

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) 

J'exécuter la requête sur mon modèle:

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

Bien sûr, vous pouvez suivre avec un autre appel de filtre et de la chaîne ceux-ci ou faire tout ce que vous voulez. Il n'y a rien de mal à ce genre d'approche, c'est ce que les gestionnaires sont ici pour :-).

+0

Doh, bien sûr, merci. J'ai été découragé par la documentation ne suggérant pas que vous pouviez transmettre des valeurs aux fonctions Manager. J'aurais dû l'essayer! –

+0

A dû utiliser 'get_queryset' au lieu de' get_query_set'. – jozxyqk