2010-12-27 15 views
5

Mam queryset, który jest dość skomplikowany, który obecnie używam w jednym widoku do uzyskania listy obiektów.Gdzie umieścić typowe zapytania w Django?

Chcę użyć tego samego zestawu pytań w kilku innych widokach, ale wolałbym nie kopiować kodu kilka razy. Mógłbym użyć Menedżera, aby zachować zestaw zapytań w jednym miejscu i używać go w każdym widoku, z wyjątkiemzapytanie polega na dacie, która jest inna na każdej stronie.

Jak rozumiem, menedżerowie nie pozwalają przekazywać zmiennych ... więc zastanawiam się, gdzie powinienem umieścić to zapytanie, aby nie powtarzać go w kilku widokach. jakieś pomysły?

FWIW, to moja queryset i published_date jest zmienną, która zmienia się na każdej stronie:

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

Odpowiedz

8

myślę, że należy właściwie użyć menedżera. I zwykle stosują metody jak to w moim menedżerów:

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) 

Potem uruchomić kwerendę na moim modelu

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

Oczywiście, można śledzić z innego połączenia filtra i łańcucha to czy cokolwiek chcesz. Nie ma nic złego w tego typu podejściu, to właśnie tutaj są menedżerowie :-).

+0

Doh, oczywiście, dzięki. Zostałem odrzucony przez dokumentację, która nie sugerowała, że ​​można przekazywać wartości do funkcji menedżera. Powinienem po prostu tego spróbować! –

+0

Musiał użyć 'get_queryset' zamiast' get_query_set'. – jozxyqk