Как сравнить поле даты с None в django ORM? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть модель, в которой есть поле даты.

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

Запрос должен вести себя по-разному на основе входных данных, предоставленных в запросе ORM.

Я передам две переменные в запрос ORM st_date и exp_date. exp_date иногда может быть None.

Мне нужно запросить модель и извлечь все записи, у которых scheduled_end_date больше, чем указано в exp_date, если в exp_date есть какое-то значение. Если нет, он не должен рассматривать фильтр вообще.

models.py:

class DtModel(models.Model):
    scheduled_start_date = DateField()
    scheduled_end_date = DateField()

Запрос ORM:

st_date="2020-05-01"
exp_date=None
DtModel.objects.filter(scheduled_start_date__gte=st_date, scheduled_end_date__lte=exp_date)

Выдает ошибку, когда exp_date является нулевым, когда он пытается сравнить None и date field?

ValueError: Невозможно использовать None в качестве значения запроса

Ответы [ 3 ]

1 голос
/ 04 мая 2020

Почему вы запрашиваете нулевое значение ... Если None означает, что вы хотите фильтровать x > date вместо x > date and < date, просто используйте большое значение даты.

if not exp_date:
  st_date="2099-01-01"
0 голосов
/ 04 мая 2020

Нельзя использовать None в качестве значения запроса в Django. Чтобы отфильтровать строки с нулевыми значениями, вы должны использовать scheduled_end_date__isnull=True. Исходя из вашего комментария к ответу @ SakuraFreak, ниже должно работать

st_date="2020-05-01"
exp_date=None
if exp_date:  # Apply filter only if exp_date is not null
    DtModel.objects.filter(scheduled_start_date__gte=st_date, scheduled_end_date__lte=exp_date)
0 голосов
/ 04 мая 2020

Вы можете проверить, имеет ли значение exp_date значение None или нет

if st_date and exp_date:
   DtModel.objects.filter(scheduled_start_date__gte=st_date, scheduled_end_date__lte=exp_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...