В данном разделе мы рассмотрим все методы, которые не возвращают QuerySet и продолжим работать с нашей моделью.
Методы которые не возвращают QuerySet
get(): Возвращает один объект. Вызывает ошибку, если поиск возвращает несколько объектов.
create(): Быстрый метод создания и сохранения объекта за один шаг.
get_or_create(): Возвращает один объект. Если объект не существует, то он его создает.
update_or_create(): Обновляет один объект. Если объект не существует, то он его создает.
bulk_create(): Вставляет список объектов в базу данных.
bulk_update(): Обновляет указанные поля в списке экземпляров модели.
count(): Подсчитывает количество объектов в возвращаемом QuerySet. Возвращает целое число.
in_bulk(): Возвращает словарь, содержащий все объекты с указаннымиID.
iterator(): Выполнение QuerySet и возвращение итератора по результатам. Может улучшить производительность и потребление памяти при запросах, возвращающих большое количество объектов.
latest(): Возвращает последний объект в таблице базы данных на основе заданного поля (полей).
earliest(): Возвращает самый ранний объект в таблице базы данных на основе заданного поля (полей).
first(): Возвращает первый объект в соответствующем QuerySet.
last(): Возвращает последний объект в соответствующем QuerySet.
aggregate(): Возвращает словарь агрегированных значений (средние, суммы и т.д.), рассчитанных по QuerySet.
exists(): ВозвращаетTrue, если QuerySet содержит какие либо результаты.
contains(): Метод возвращаетTrue, если набор QuerySet содержит определенный объект, иFalse- если не содержит.
update(): Выполняет SQL операторUPDATEв указанном поле (полях).
delete(): Выполняет SQL операторDELETE, удаляющий все строки в QuerySet.
as_manager(): Возвращает экземпляр классаManager, содержащий копию методов QuerySet.
explain(): Возвращает строку плана выполнения QuerySet. Используется для анализа выполнения запросов.
Рассмотрим все эти методы подробнее:
get()
Возвращает один единственный объект. Если нет совпадения результатов, это вызовет исключение DoesNotExist. Если запросу get() соответствует более одного элемента. Это вызовет исключение MultipleObjects.
Employee.objects.get(id=1)
create()
Удобный метод создания объекта и его сохранения за один шаг. Асинхронная версия acreate()
Department.objects.create(name='Testing', description='Test Engineer')
get_or_create()
Метод будет пытаться извлечь запись, соответствующую полям поиска. Если записи не существует, то она будет создана. Возвращаемое значение будет кортежем, в котором будет содержаться созданный или извлеченный объект, а также булевым значением, которое будет True, если была создана новая запись:
>>> e, bool = Department.objects.get_or_create(name='Sys_Admin', description='System Administration Department')
>>> e
<Department: Sys_Admin>
>>> bool
True
Если мы попробуем повторить выполнение данного кода, то получим:
>>> e, bool = Department.objects.get_or_create(name='Sys_Admin', description='System Administration Department')
>>> e
<Department: Sys_Admin>
>>> bool
False
Асинхронная версия - aget_or_create()
update_or_create()
Работает аналогично get_or_create(), за исключением того, что вы передаете поля поиска и словарь с именем defaults, содержащий поля для обновления. Если объект не существует, метод создаст новую запись в базе данных:
e, bool = Department.objects.update_or_create(name='Sys_Admin', description='System Administration Department', defaults={'name':'Sys admin'}
Асинхронная версия - aupdate_or_create()
bulk_create()
Метод bulk_create() экономит время, вставляя в базу данных сразу несколько объектов, чаще всего в одном запросе. Функция имеет один обязательный параметр - список объектов:
e = Department.objects.bulk_create([Department(name='Test_bulk', description='Test bulk_create'),
Department(name='Test_bulk_2', description='Test bulk_create 2')])
Асинхронная версия - abulk_create()
bulk_update()
bulk_update(), наоборот, берет список объектов модели и обновляет отдельные поля в выбранных экземплярах модели. Данный метод будет работать только со списком объектов, поэтому сначала нужно создать список объектов, который мы хотим обновить:
>>> e = Department.objects.filter(id__gt = 4)
>>> e
<QuerySet [<Department: Test_bulk>, <Department: Test_bulk_2>]>
bulk_update будет работать только со списком объектов, поэтому сначала нужно создать список объектов, который мы хотим обновить. Затем мы вносим изменения в объекты из списка:
>>> e_list = [e[0], e[1]]
>>> e_list[0].name = 'Test_bulk_update'
>>> e_list[1].name = 'Test_bulk_update_2'
После уже мы можем использовать функцию bulk_update для сохранения изменений в базе данных в одном запросе:
>>> Department.objects.bulk_update(e_list, ['name'])
Асинхронная версия abulk_update()
count()
Подсчитывает количество объектов в QuerySet. Может использоваться для подсчета всех объектов в таблице базы данных:
>>> Employee.objects.count()
4
Или используется для подсчета количества объектов, возвращенных запросом:
>>> Employee.objects.filter(last_name='Doe').count()
2
count() функционально эквивалентна использованию функции aggregate(), но count() имеет более чистый синтаксис и вероятно будет быстрее в больших наборах данных. Например:
>>> Employee.objects.all().aggregate(Count('id'))
{'id__count': 4}
Асинхронная версия - acount()