Фильтр Django - заполнено ли поле DateTimeField
к моей модели я добавил просто DateTimeField:
expired = models.DateTimeField(default=None)
. Значение поля может быть либо None, либо Datetime.
Я хотел бы отфильтровать объекты, в которых истекшее время заполнено любой точкой отсчета, однако мне трудно найти подходящий фильтр.
Мне кажется, я перепробовал все комбинации filter / exclude и expired__isnull=True / expired=None, но я так и не получил точное число.
Каким образом правильно фильтровать, есть ли в поле DateTime или нет?
Django: 1.11.16
Спасибо.
В моей модели 2122 строки:
Counter(Obj.objects.filter().values_list('expired'))
Counter({(datetime.datetime(2021, 9, 24, 1, 6, 50),): 1,
(datetime.datetime(2021, 9, 24, 1, 6, 51),): 1,
(datetime.datetime(2021, 9, 24, 1, 6, 32),): 1,
(datetime.datetime(2021, 9, 24, 1, 12, 3),): 1,
(datetime.datetime(2021, 9, 24, 1, 12, 44),): 1,
(datetime.datetime(2021, 12, 4, 1, 31, 25),): 1,
(datetime.datetime(2021, 12, 4, 1, 37, 49),): 1,
(datetime.datetime(2021, 12, 4, 1, 9, 55),): 1,
(None,): 2087,
(datetime.datetime(2021, 12, 4, 1, 37, 52),): 1,
(datetime.datetime(2021, 12, 4, 1, 2, 8),): 4,
(datetime.datetime(2021, 12, 4, 1, 5, 14),): 9,
(datetime.datetime(2021, 9, 28, 0, 43, 51),): 1,
(datetime.datetime(2021, 12, 4, 1, 0, 13),): 7,
(datetime.datetime(2021, 12, 4, 1, 9, 59),): 2,
(datetime.datetime(2021, 12, 3, 17, 25, 46),): 1,
(datetime.datetime(2021, 12, 4, 1, 9, 54),): 1,
(datetime.datetime(2021, 9, 24, 1, 14, 30),): 1})
.
Obj.objects.filter(expired__isnull=False).count() возвращает все строки (2122) ... .
Obj.objects.filter(expired=None).count() возвращает 2087 строк вместо 35 ожидаемых.
Obj.objects.exclude(expired=None).count() возвращает 2122, так что все строки.
Запрос хороший, проблема в определении модели. Оно должно быть blank=True и null=True.
попробуйте изменить поле в Model
expired = models.DateTimeField(
auto_now=False,
null=True,
blank=True
)