Фильтрация QuerySet в Djnago, где поле имеет определенное значение или является null
как правильно сделать это в Django, я хочу фильтровать кверисет, где поле имеет определенное значение или является null, что означает, что если я отфильтрую кверисет по полю "type", он вернет кверисет с объектами, имеющими определенное значение типа "active", а также объект с "type" имеет значение null
любая помощь будет очень признательна
Вы можете работать с Q
объектами [Django-doc] для этого:
MyModel.objects.filter(
Q(type='active') | Q(type=None)
)
Здесь мы объединяем два объекта Q
, которые действуют как фильтры с побитовым оператором или |
, и это означает, что мы создаем фильтр, который действует как логическое или между двумя условиями фильтра.
В документации Django есть целый раздел, посвященный поиску полей в модели . Но если вы не хотите возиться с этим, вот несколько примеров:
# Obtaining all non-null fields
Model.objects.filter(some_field__isnull=False)
# Obtaining all rows with field value greater than some value
Model.objects.filter(some_field__isnull=False, some_field__gt=value)
# Actually the better way of writing complex queries is using Q objects
from django.db.models import Q
Model.objects.filter(Q(some_field__isnull=False) & Q(some_field__gt=value)) # The same thing as the previous example
# Using Q objects in this situation may seem useless and it kinda is, but as for me
# This improves readability of your query
Есть еще много вещей, которые вы можете захотеть сделать с вашим полем, но я думаю, что описал наиболее распространенный случай использования.
Редактирование
Как написано в ответе Виллема, чтобы получить строки, имеющие значение "active" или null, нужно написать такой запрос:
Model.objects.filter(Q(type='active') | Q(type__isnull=True))
Надеюсь, это поможет.
Я думаю, что это самая простая техника для достижения вашей цели.
Model.objects.filter(Q(type='active') | Q(type=True))