Фильтр 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
    )
Вернуться на верх