Как исключить результаты с get_object_or_404?

В Django можно использовать исключение для создания SQL, подобного not equal. Пример мог быть.

Model.objects.exclude(status='deleted')

Теперь это работает отлично, и исключите, очень гибко. Так как я немного ленив, я хотел бы получить ту функциональность при использовании get_object_or_404, но я не нашел способ сделать это, так как Вы не можете использовать, исключают на get_object_or_404.

То, что я хочу, должно сделать что-то вроде этого:

model = get_object_or_404(pk=id, status__exclude='deleted')

Но к сожалению это не работает, поскольку нет исключить фильтра запроса или подобен. Лучшее, которое я придумал до сих пор, делает что-то вроде этого:

object = get_object_or_404(pk=id)
if object.status == 'deleted':
    return HttpResponseNotfound('text')

При выполнении чего-то как этот, действительно побеждает точку использования get_object_or_404, так как это больше не удобная острота.

Кроме того, я мог сделать:

object = get_object_or_404(pk=id, status__in=['list', 'of', 'items'])

Но это не было бы очень удобно в сопровождении, поскольку я должен буду усовершенствовать список.

Я задаюсь вопросом, пропускаю ли я некоторый прием или функцию в django для использования get_object_or_404 получить желаемый результат?

15
задан googletorp 15 June 2010 в 15:03
поделиться

1 ответ

Используйте django.db.models.Q :

from django.db.models import Q

model = get_object_or_404(MyModel, ~Q(status='deleted'), pk=id)

Объекты Q позволяют НЕ (с оператором ~ ) и ИЛИ (с | оператор) в дополнение к И.

Обратите внимание, что объект Q должен стоять перед pk = id , потому что аргументы ключевого слова в Python должны идти последними.

18
ответ дан 1 December 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: