Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

2.6 Методы, которые не возвращают QuerySet
3 из 3 шагов пройдено

В данном разделе мы рассмотрим все методы, которые не возвращают 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()


Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий
Нет обсуждений. Начните первое.