Разница между методами Django filter () и get () - PullRequest
17 голосов
/ 11 июля 2010

В чем разница между

mymodel=model.objects.get(name='pol')

и

mymodel=model.objects.filter(name='pol')

Ответы [ 6 ]

42 голосов
/ 11 июля 2010

Документы Django QuerySet очень ясны в этом:

get(**kwargs)¶

Возвращает объект, соответствующий заданному параметры поиска, которые должны быть в формат описан в полевых поисках.

get () повышает MultipleObjectsReturned если было найдено более одного объекта. Исключением MultipleObjectsReturned является атрибут класса модели.

get () вызывает исключение DoesNotExist если объект не был найден для заданные параметры. Это исключение также атрибут класса модели.

filter(**kwargs)

Возвращает новый QuerySet, содержащий объекты, которые соответствуют заданным параметрам поиска.

В основном используйте get(), когда вы хотите получить один уникальный объект , и filter(), когда вы хотите получить все объекты , которые соответствуют вашим параметрам поиска.

7 голосов
/ 21 декабря 2012

Кроме того, отметим, что pol недоступен:

if mymodel=model.objects.get(name='pol').exists()==False:
   print "Pol does not exist"

вы получите: AttributeError: у объекта «Модель» нет атрибута «существует»

но:

if mymodel=model.objects.filter(name='pol').exists()==False:
   print "Pol does not exist"

вы получите: Pol не существует.

т.е. Если вы хотите запустить некоторый код в зависимости от того, можно ли найти один объект, используйте фильтр. По какой-то причине существует () работает на QuerySet, но не конкретный объект, возвращаемый с get.

5 голосов
/ 29 декабря 2012

Обратите внимание, что за кулисами метод get () django запускает метод filter (), но проверяет, что набор результатов фильтрации содержит ровно одну запись

0 голосов
/ 12 октября 2018

Модель = Сотрудник

Сотрудник: имя, возраст, местоположение Получить:

Employee.objects.get (id = 1) Это будет ошибка, если данный объектFilter: Employee.objects.filter (id = 1)]> Возвращает пустой набор запросов, если заданный объект отсутствует

0 голосов
/ 27 сентября 2017

get () возвращает объект, который соответствует критерию поиска.

filter () возвращает QuerySet, который соответствует критерию поиска.

Например, следующее

Entry.objects.filter(pub_date__year=2006)

эквивалентно

Entry.objects.all().filter(pub_date__year=2006)

, что означает, что filter () является немного дорогой операцией, если в модельном классе имеется большое количество объектов, тогда как get () - прямой подход.

источник: Джанго делает запросы

0 голосов
/ 10 сентября 2014

если вы знаете, что это один объект, который соответствует вашему запросу, используйте «get». Он потерпит неудачу, если его больше одного, и выдаст ошибку, подобную этой

Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/django/db/models/manager.py", line 143, in    get
return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/django/db/models/query.py", line 407, in get
(self.model._meta.object_name, num))
MultipleObjectsReturned: get() returned more than one Poll -- it returned 2!

В противном случае используйте «фильтр», который выдает список объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...