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')