В чем разница между
mymodel=model.objects.get(name='pol')
и
mymodel=model.objects.filter(name='pol')
В чем разница между
mymodel=model.objects.get(name='pol')
и
mymodel=model.objects.filter(name='pol')
Django QuerySet docs очень понятны:
get(**kwargs)¶
Возвращает объект, соответствующий данному параметры поиска, которые должны быть в формат, описанный в полевых поисках.
get() вызывает множественные объектыОбратные если было найдено несколько объектов. Исключено исключение MultipleObjectsReturned атрибут класса модели.
get() вызывает исключение DoNotExist если объект не найден для заданные параметры. Это исключение также атрибут класса модели.
filter(**kwargs)
Возвращает новый объект QuerySet, который соответствует указанным параметрам поиска.
В основном используйте get, когда вы хотите получить единственный уникальный объект, и фильтруйте, когда хотите получить все объекты, соответствующие вашим параметрам поиска.
Кроме того, на боковой ноте предполагается, что pol не доступен:
if mymodel=model.objects.get(name='pol').exists()==False:
print "Pol does not exist"
вы получите: AttributeError: объект 'Model' не имеет атрибута 'exists'
но:
if mymodel=model.objects.filter(name='pol').exists()==False:
print "Pol does not exist"
вы получите: Pol не существует.
т.е. Если вы хотите запустить некоторый код в зависимости от того, можно ли найти один объект, используйте фильтр. По какой-то причине exists() работает с QuerySet, но не с конкретным объектом, возвращаемым с помощью get.
Обратите внимание, что за кулисами метод django get() запускает метод filter(), но проверяет, что набор результатов фильтра - это ровно одна запись
get() возвращает объект, соответствующий критерию поиска.
filter() возвращает QuerySet критерий поиска математики.
Например, следующий
Entry.objects.filter(pub_date__year=2006)
эквивалентно
Entry.objects.all().filter(pub_date__year=2006)
что означает, что фильтр() немного дорогой, если класс модели имеет большое количество объектов, тогда как get() - прямой подход.
источник: Django делает запросы
если вы знаете это один объект, который соответствует вашему запросу, используйте "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!
В противном случае используйте "фильтр", который дает вам список объектов.