моделі django, що вибирають одне поле


102

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

Я знаю, що можу зробити це так (сподіваюся, я навіть так роблю):

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

Запитав би базу даних для всіх полів і використовуючи лише одне? Чи є кращий (швидший) спосіб зробити це?


Що ви маєте на увазі під словом "і використовуючи лише один"? А SELECT colзамість SELECT *?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Відповіді:


184
Employees.objects.values_list('eng_name', flat=True)

Це створює плоский список усіх eng_names. Якщо вам потрібно більше одного поля на рядок, ви не можете скласти плоский список: це створить список кортежів:

Employees.objects.values_list('eng_name', 'rank')

дякую за відповідь. Що робити, якщо я хочу вибрати лише 1 або більше полів (не всіх)?
zentenk,

Вибачте, я не розумію питання.
Даніель Роузман,

3
поділіться цим документом. ця воля допомагає іншим
bob marti

25

Окрім того, values_listяк згадує Даніель, ви також можете використовувати (або для протилежного ефекту) отримати набір запитів об’єктів, що мають лише їх ідентифікатор та вказані поля:onlydefer

Employees.objects.only('eng_name')

Після цього буде запущений один запит:

SELECT id, eng_name FROM employees

3
Ця команда повертає мені всі поля для моєї версії Django 2.1.3 та версії python 3.6.2.
Ананті

Він отримає лише цей файл, але якщо ви спробуєте отримати доступ до інших полів, буде виконаний окремий запит до бази даних. Отже, це хороший прийом оптимізації, але переконайтесь, що ви не створюєте ці додаткові запити. Інакше ви втратите продуктивність, а не отримаєте її.
Еерік Свен Пуудіст,

6

Ми можемо вибрати необхідні поля над значеннями.

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

Після успішного запуску запиту, як зберігати значення поля у змінній, наприклад. var_name = <ім'я_запиту>. <ім'я_поля> ?
user12379095

@ user12379095 просто так:var_name = Employee.objects.all().values('eng_name','rank')
theQuestionMan

@ user12379095, а потім використовувати це ім'я var_name - наприклад: роздрукувати імена всіх співробітників та звання, ви можете зробити це:for person in var_name: print(person['eng_name'] + " " + person['rank'])
theQuestionMan

3

Відповідь Оскара Перссона є найкращим способом обробки, оскільки полегшує передачу даних до контексту та нормальну обробку з шаблону, оскільки ми отримуємо екземпляри об’єктів (легко ітерабельні для отримання реквізиту) замість простого списку значень.

Після цього ви можете просто отримати бажаний реквізит:

for employee in employees:
    print(employee.eng_name)

Або в шаблоні:

{% for employee in employees %}

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

{% endfor %}

1

Ви можете використовувати values_list поряд із фільтром так;

active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)

Детальніше тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.