Где разместить общие запросы в Django? - PullRequest
5 голосов
/ 27 декабря 2010

У меня достаточно сложный набор запросов, который я сейчас использую в одном представлении для получения списка объектов.

Я хочу использовать один и тот же набор запросов в нескольких других представлениях, но предпочел бы не просто копировать код несколько раз. Я мог бы использовать Менеджер, чтобы хранить набор запросов в одном месте, и использовать его в каждом представлении , за исключением , запрос основан на дате, которая отличается на каждой странице.

Насколько я понимаю, менеджеры не разрешают вам передавать переменные ... поэтому мне интересно, куда я должен поместить этот запрос, чтобы не повторять его в нескольких представлениях. Есть мысли?

FWIW, это мой набор запросов, а ключ_публикации - это переменная, которая изменяется на каждой странице:

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

1 Ответ

8 голосов
/ 28 декабря 2010

Я думаю, что вы должны использовать менеджер.Я обычно использую такие методы в моих менеджерах:

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)

Затем я запускаю запрос для моей модели:

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

Конечно, вы можете выполнить еще один вызов фильтра изацепи их или делай что хочешь.В таком подходе нет ничего плохого, вот для чего здесь менеджеры: -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...