У меня есть таблица / модели, Employees
и я хотел бы получить все строки одного поля в качестве набора запросов.
Я знаю, что могу сделать это вот так (надеюсь, я даже делаю это правильно):
emp_list = Employees.objects.get(all)
emp_names = emp_list.eng_name
Будет ли запрашивать базу данных для всех полей и использовать только одно? Есть ли лучший (более быстрый) способ сделать это?
python
django
django-models
зентенк
источник
источник
SELECT col
вместоSELECT *
?Ответы:
Employees.objects.values_list('eng_name', flat=True)
Это создает плоский список всех
eng_name
s. Если вам нужно более одного поля в строке, вы не можете создать плоский список: это создаст список кортежей:Employees.objects.values_list('eng_name', 'rank')
источник
В дополнение к тому,
values_list
что упоминает Даниэль, вы также можете использовать (или для противоположного эффекта), чтобы получить набор запросов объектов, имеющих только их идентификатор и указанные поля:only
defer
Employees.objects.only('eng_name')
Это запустит один запрос:
источник
Мы можем выделить обязательные поля над значениями.
Employee.objects.all().values('eng_name','rank')
источник
var_name = Employee.objects.all().values('eng_name','rank')
for person in var_name: print(person['eng_name'] + " " + person['rank'])
Ответ Оскара Перссона - лучший способ справиться с этим, потому что упрощает передачу данных в контекст и их обычную обработку из шаблона. обычную поскольку мы получаем экземпляры объекта (легко итеративно для получения реквизита) вместо простого списка значений.
После этого вы можете легко получить желаемый реквизит:
for employee in employees: print(employee.eng_name)
Или в шаблоне:
{% for employee in employees %} <p>{{ employee.eng_name }}</p> {% endfor %}
источник
Вы можете использовать values_list вместе с фильтром, например:
active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)
Подробнее здесь
источник