Запрос Django ORM против данных месяц, день, год? - PullRequest
3 голосов
/ 08 августа 2011

Итак, я знаю, что могу использовать фильтры __lte и __gte для дат объектов, используя ORM Django, так:

events = Event.objects.all().order_by('start_date').filter(
    start_date__lte=_day, end_date__gte=_day
)       

Я также могу запрашивать компоненты даты:

events = Event.objects.all().order_by('start_date').filter(
    start_date__day=_day.day, end_date__day=_day.day
)       

но я пытаюсь выяснить, могу ли я запрашивать определенные части даты И также использовать операторы gte и lte , такие как следующая попытка, что не не работает:

events = Event.objects.all().order_by('start_date').filter(
    start_date__day__lte=8, end_date__day__gte=_day
)   

1 Ответ

3 голосов
/ 08 августа 2011

Краткий ответ: нет, вы не можете.

Длинный (er) ответ:

В этом случае я бы создал метод на менеджере и использовал бы либо .extra(where='...') (что, вероятно, потребовало бы специфического для БД кода SQL), либо комбинацию models.Q объектов в наборе запросов Event.

class EventManager(models.Manager):
    def day_range(self, start, end):
        qs = self.get_queryset()
        qs = qs.extra(where=["day(start_date) < %s and day(end_date) > %s"],
                      params=[start, end])
        return qs

Отредактировано: аргумент where должен быть последовательностью.

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