В 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
получить желаемый результат?
Используйте 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 должны идти последними.