Когда я прошу менеджера модели получить объект, он возникает, DoesNotExist
когда нет подходящего объекта.
go = Content.objects.get(name="baby")
Вместо того DoesNotExist
, как я могу go
быть None
вместо этого?
python
django
django-queryset
TIMEX
источник
источник
SomeModel.objects.filter(foo='bar').first()
это возвращает первое совпадение или None. Это не подведет, если есть несколько примеров, какqueryset.get()
filter().first()
я думаю, что исключение - это путь.Начиная с django 1.6, вы можете использовать метод first () следующим образом:
источник
Из Django документов
Вы можете поймать исключение и назначить
None
идти.источник
Вы можете создать универсальную функцию для этого.
Используйте это как ниже:
go будет None, если ни одна запись не соответствует, иначе вернет запись Content.
Примечание. Возникает исключение MultipleObjectsReturned, если для name = "baby" возвращено более одной записи.
источник
Вы можете сделать это следующим образом:
Теперь переменная go может быть либо нужным вам объектом, либо None
Ссылка: https://docs.djangoproject.com/en/1.8/ref/models/querysets/#django.db.models.query.QuerySet.first
источник
Чтобы упростить задачу, вот фрагмент кода, который я написал, на основе входных данных из замечательных ответов здесь:
И тогда в вашей модели:
Вот и все. Теперь у вас есть MyModel.objects.get (), а также MyModel.objetcs.get_or_none ()
источник
Вы можете использовать
exists
с фильтром:просто альтернатива, если вы только хотите знать, существует ли он
источник
Note: If you only want to determine if at least one result exists (and don’t need the actual objects), it’s more efficient to use exists().
exists()
будет использоваться сif
предложением перед извлечением объекта, что приведет к двойному попаданию в БД. Я все еще буду держать комментарий в случае, если он поможет кому-то еще.Обработка исключений в разных точках в ваших представлениях может быть очень трудоемкой. Как насчет определения собственного менеджера моделей в файле models.py, например
а затем включить его в класс модели содержимого
Таким образом, это может быть легко решено в представлениях, т.е.
источник
return self.get(**kwargs)
его работать на меня. Не говорить, что с ответом что-то не так, просто совет для тех, кто пытается использовать его с более поздними версиями (или с тем, что мешало мне работать).Это одна из тех раздражающих функций, которые вы, возможно, не захотите повторно реализовывать:
источник
get_object_or_None
но обнаружил, что он все еще вызывает,MultipleObjectsReturned
если более одного объекта. Таким образом, пользователь может рассмотреть окружение сtry-except
(которое уже есть в самой функцииtry-except
).Если вы хотите простое однострочное решение, которое не включает обработку исключений, условные операторы или требование Django 1.6+, сделайте это вместо этого:
источник
Я думаю, что это не плохая идея использовать
get_object_or_404()
Этот пример эквивалентен:
Вы можете прочитать больше о get_object_or_404 () в онлайн документации django.
источник
С django 1.7 вы можете делать следующее:
Преимущество «MyQuerySet.as_manager ()» заключается в том, что оба следующих варианта будут работать:
источник
Вот вариант вспомогательной функции, которая позволяет вам при желании передать
QuerySet
экземпляр, если вы хотите получить уникальный объект (если имеется) из набора запросов, отличного от набора запросовall
объектов модели (например, из подмножества дочерних элементов, принадлежащих родительский экземпляр):Это можно использовать двумя способами, например:
obj = get_unique_or_none(Model, **kwargs)
как и ранее обсуждалосьobj = get_unique_or_none(Model, parent.children, **kwargs)
источник
Без исключений:
Используя исключение:
Существует немного спора о том, когда следует использовать исключение в Python. С одной стороны, «проще просить прощения, чем разрешения». Хотя я согласен с этим, я считаю, что исключение должно оставаться, ну, исключение, и «идеальный случай» должен выполняться, не затрагивая его.
источник
Мы можем использовать встроенное исключение Django, которое прикреплено к моделям, названным как
.DoesNotExist
. Таким образом, мы не должны импортироватьObjectDoesNotExist
исключения.Вместо этого:
Мы можем это сделать:
источник
Это подражатель из get_object_or_404 Джанго за исключением того, что метод возвращает None. Это чрезвычайно полезно, когда нам нужно использовать
only()
запрос, чтобы получить только определенные поля. Этот метод может принимать модель или набор запросов.источник
Может быть, лучше вы используете:
источник