Рубрики
Без рубрики

Напишите лучшие запросы, используя intain_list в django

Django Orm отлично, но не всегда может быть хорошей идеей, чтобы использовать его в самом примитивном состоянии как … Теги с Джанго, Python.

Django ORM отлично, но не всегда может быть неплохой идеей, чтобы использовать его в самом примитивном состоянии, поскольку он может привести к неэффективным запросам.

Например, рассмотрим модель базы данных, называемую запись, которая состоит из идентификатора, имени, создания_ата и флага IS_DELET, указывающего, было ли это удалено или нет.

from django.db import models

class Record(models.Model):
  # id will be created automatically
  name = models.CharField(max_length=255)
  created_at = models.DateTimeField(auto_now_add=True)
  is_deleted = models.BooleanField(default=False)

Когда вы запросите, используя Record.Objects.filter (is_deleted = false) Основная база данных базы данных выглядит что-то вроде этого:

SELECT id,
       name,
       created_at,
       is_deleted
FROM   records
WHERE  NOT is_deleted; 

Это не только это запрашивание всех полей таблицы, но он возвращает запрос экземпляров модели, как это:

>>> Record.objects.filter(is_deleted=False)
, , ]>

В большинстве случаев вам не требуются все поля вашей модели. Что еще хуже, в том, что если ваша модель записи состоит из 10 полей, этот запрос в конечном итоге принесет все из них из базы данных, что делает ваш запрос значительно медленнее.

К счастью, есть два очень простых способа сделать этот запрос эффективным. Вы можете либо использовать значения или значения_List.

Использование значений () для получения определенных столбцов БД

Допустим, вы хотите отобразить имена всех записей, которые не были удалены. Вы можете получить только столбец имени из базы данных, сделав небольшую модификацию в запрос ORM:

>>> Record.objects.filter(is_deleted=False).values('name')

Как вы можете видеть, вместо того, чтобы возвращать список объектов записи, этот запрос возвращает список словарей, состоящий из поля имени.   Базовый запрос сейчас становится:

SELECT name
FROM   records
WHERE  NOT is_deleted; 

Вы можете получить больше столбцов, если вы хотите, предоставляя список столбцов, которые вам нужны в методе значений ().

>>> Record.objects.filter(is_deleted=False).values('id', 'name')

Использование stass_list () для получения определенных столбцов БД

Это работает в значительной степени так же, как значения (), за исключением того, что он возвращает кортеж вместо словаря:

>>> Record.objects.filter(is_deleted=False).values_list('name')

>>>
>>> Record.objects.filter(is_deleted=False).values_list('id', 'name')

>>>

Изящная вещь о incys_list () заключается в том, что если вам нужно только пройти в одном поле, вы можете использовать параметр для возврата списка одного значения вместо кортежей.

>>> Record.objects.filter(is_deleted=False).values_list('name',flat=True)

Закрытие заметок

С точки зрения производительности нет никаких различий между значениями () и states_List ().

Они оба предназначены в качестве оптимизации для извлечения подмножества данных при избежании создания экземпляров модели и сделать запрос базы данных более эффективным, только выбрав определенные поля.

Решение которого из них используется, зависит от того, какую структуру данных вы предпочитаете работать с.

Я обычно нахожу словарь, более интуитивно понятный, чем кортеж, и, следовательно, предпочитаете значения () над значениями_List (). Однако, если мне нужно только одно поле из запроса, я предпочитаю использовать значения_List () с.

Первоначально опубликовано в моем блоге

Оригинал: “https://dev.to/sankalpjonna/write-better-queries-using-valueslist-in-django-2nia”