Django - исключить два условия в запросе
Какой лучший способ сделать это?
Object.objects.filter(country_send=country).exclude(status__exact='').order_by('-id')
Object.objects.filter(country_send=country).exclude(status__exact='deleted').order_by('-id')
Я пытаюсь исключить объект без статуса и статуса "удалено". Могу ли я сделать это в одном порядке? Если не лучший способ?
Я новичок в Django.
благодаря
Ответы
Ответ 1
Вы можете попробовать использовать "списки". В списке статуса вы можете добавить все слова, которые вы хотите.
status = ['deleted', '']
Object.objects.filter(country_send=country).exclude(status__in=status).order_by('-id')
Подробнее о списке: http://www.sthurlow.com/python/lesson06/
Ответ 2
Взгляните на объекты Q
Ваш запрос будет выглядеть следующим образом:
from django.db.models import Q
Object.objects.filter(country_send=country).exclude(Q(status__exact='') | Q(status__exact='deleted')).order_by('-id')
Ответ 3
Вы можете рассмотреть возможность объединения вызовов exclude
вместе:
Object.objects.filter(country_send=country).exclude(status='').exclude(status='deleted').order_by('-id')
Это имеет эффект, действующий как оператор or
, и более читабельный, чем при использовании объекта Q()
.
Подход "список" от Маркоса выше, вероятно, лучше всего подходит в вашем случае, но мой подход был бы полезен, если вы "ориентируетесь" в других областях:
Book.objects.exclude(author='Joe').exclude(publish_year='2018')
Это вернет все Books
и исключит те, которые были созданы Джо ИЛИ опубликованы в 2018 году.
Ответ 4
Вы можете сделать это с помощью Q
from django.db.models import Q
Model.objects.filter(country_send=country, ~Q(status__in=['deleted', ''])).order_by('-id')