Django: странная фильтрация базы данных для поведения без значений - PullRequest
0 голосов
/ 01 апреля 2020

Я сталкиваюсь с очень странной ситуацией при выполнении запроса к базе данных из Django. У меня есть модель, chat, которая имеет поле с именем expired, которое может быть null. Цель состоит в том, чтобы отфильтровать все элементы из базы данных чата, для которых истек срок действия, не равный None. Выполнение следующего быстрого теста:

    for chat in Chat.objects.all():
        print(chat.expired is None)

дает мне:

True
True
True
True
True
False

Таким образом, существуют объекты Chat, поля с истекшим сроком действия не являются ни одним. Но при фильтрации:

print(Chat.objects.filter(expired__isnull=False))

дает мне:

<QuerySet [<Chat: 1, type: G>, <Chat: 2, type: G>, <Chat: 3, type: G>, <Chat: 4, type: G>, <Chat: 5, type: G>, <Chat: 6, type: P>]>

, а следующее:

    print(Chat.objects.filter(expired__isnull=True))

дает:

<QuerySet []>

Оба вывода запроса не могут быть правильными, поскольку в первом тесте мы можем видеть, что существует 6 объектов Chat, не все с полями expired, установленными в None, но первый запрос дает шесть элементов. Второй получает ноль, хотя есть элементы с полями с истекшим сроком для None. В чем проблема?

Заранее спасибо!

Редактировать

Модель:

class Chat(models.Model):
    TYPE_CHOICES = [
        ('P', 'private'),
        ('G', 'group'),
    ]
    name = models.CharField(max_length=100, default="private")
    type = models.CharField(max_length=2, choices=TYPE_CHOICES, default='P')
    image = models.ImageField(null=True, blank=True)

    expired = models.DateTimeField(null=True, blank=True)

1 Ответ

0 голосов
/ 01 апреля 2020

Вы пробовали точный поиск полей? Примерно так

print(Chat.objects.filter(expired__exact=None))

Смотри еще: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#id4

...