Django фильтр с «день-месяц» вместе без учета года - PullRequest
0 голосов
/ 05 января 2020

Я хочу отфильтровать поле datetime через 1 месяц после сегодняшнего дня без учета года.

class Contract(models.Model):
    title = models.CharField(max_length=200, null=True)
    date = models.DateField()

Пример фильтра между: С: Today Day и Месяц: 01-05 (% m-% d) До: Через месяц: 02-05 (% m-% d)

Вот мой код:

        today = datetime.date.today()
        foremonth = today + relativedelta(months=1)
        return_list=[]
        s = Contract.objects.filter(active=True).order_by('date__month', 'date__day')
        for i in s:
            k = i.date.strftime("%m-%d")
            if k > today.strftime("%m-%d") and k < foremonth.strftime("%m-%d"):
                return_list.append(i)
        return return_list

Как мне сделать django запрос

1 Ответ

1 голос
/ 05 января 2020

Что вы можете сделать, это использовать функции базы данных Django, как описано здесь , Django аннотации и объединить их с Q для создания запроса.

  1. Вам необходимо выполнить условия, при которых либо день больше, чем ваш начальный день И месяц является нашим начальным месяцем, либо день меньше вашего конечного дня, а месяц - ваш конечный месяц. Таким образом, нам нужны значения дня и месяца для этих условий.
  2. Затем мы создаем условия запроса, используя Q, поскольку нам нужно ИЛИ.
  3. Наконец, мы аннотируем объекты Контракта значениями дня и месяца и применить фильтр.
    today = datetime.date.today()
    foremonth = today + relativedelta(months=1)

    start_day = today.day
    start_month = today.month
    end_day = foremonth.day
    end_month = foremonth.month

    # Create the query
    query = Q(d__gte=start_day, m=start_month) | Q(d__lte=end_day, m=end_month)

    # Annotate your objects with day and month and filter results

    Contract.objects.annotate(d=ExtractDay('date'), m=ExtractMonth('date')).filter(query)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...