Django модели выбирают одно поле - PullRequest
65 голосов
/ 21 сентября 2011

У меня есть таблица / модели с именем Employees, и я хотел бы получить все строки одного поля в виде набора запросов.

Я знаю, что могу сделать это так (надеюсь, что я делаю этодаже верно):

emp_list = Employees.objects.get(all)
emp_names = emp_list.eng_name

Будет ли запрашивать в базе данных все поля и использовать только одно?Есть ли лучший (более быстрый) способ сделать это?

Ответы [ 4 ]

116 голосов
/ 21 сентября 2011
Employees.objects.values_list('eng_name', flat=True)

Это создает плоский список всех eng_name с.Если вам нужно более одного поля в строке, вы не можете сделать плоский список: это создаст список кортежей:

Employees.objects.values_list('eng_name', 'rank')
15 голосов
/ 08 февраля 2017

В дополнение к values_list как Даниэль упоминает , вы также можете использовать only (или defer дляобратный эффект), чтобы получить набор запросов объектов, имеющих только свои id и указанные поля:

Employees.objects.only('eng_name')

Это запустит один запрос:

SELECT id, eng_name FROM employees
1 голос
/ 07 июня 2019

Ответ Оскара Перссона - лучший способ справиться с этим, потому что упрощает передачу данных в контекст и нормальную обработку их из шаблона , когда мы получаем экземпляры объекта ( легко повторяется, чтобы получить реквизит) вместо простого списка значений.

После этого вы можете легко получить желаемую опору:

for employee in employees:
    print(employee.eng_name)

Или в шаблоне:

{% for employee in employees %}

    <p>{{ employee.eng_name }}</p>

{% endfor %}
1 голос
/ 22 июля 2018

Мы можем выбрать обязательные поля для значений.

Employee.objects.all().values('eng_name','rank')
...