modelos de django seleccionando un solo campo

102

Tengo una tabla / modelos llamados Employeesy me gustaría obtener todas las filas de un solo campo como un conjunto de consultas.

Sé que puedo hacerlo así (espero estar haciendo esto bien incluso):

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

¿Consultaría la base de datos para todos los campos y usaría solo uno? ¿Existe una forma mejor (más rápida) de hacer esto?

Zentenk
fuente
¿Qué quieres decir con "y usar solo uno"? ¿A en SELECT collugar de SELECT *?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

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

Eso crea una lista plana de todos los eng_names. Si desea más de un campo por fila, no puede hacer una lista plana: esto creará una lista de tuplas:

Employees.objects.values_list('eng_name', 'rank')
Daniel Roseman
fuente
gracias por la respuesta, ¿qué pasa si quiero seleccionar solo 1 o más campos (no todos)?
zentenk
Lo siento, no entiendo la pregunta.
Daniel Roseman
3
por favor comparta el documento que ayudará a otros
bob marti
25

Además de values_listcomo menciona Daniel , también puede usar (o para el efecto contrario) para obtener un conjunto de consultas de objetos que solo tienen su identificación y campos especificados:onlydefer

Employees.objects.only('eng_name')

Esto ejecutará una sola consulta:

SELECT id, eng_name FROM employees
Oskar Persson
fuente
3
Este comando me devuelve todos los campos para mi versión 2.1.3 de Django y la versión 3.6.2 de python.
Ananthi
Solo buscará este archivo, pero si intenta acceder a otros campos, se ejecutará una consulta de base de datos separada. Así que esta es una buena técnica de optimización, pero asegúrese de no crear estas consultas adicionales. De lo contrario, perderá rendimiento en lugar de ganarlo.
Eerik Sven Puudist
6

Podemos seleccionar campos obligatorios sobre valores.

Employee.objects.all().values('eng_name','rank')
Alok Choudhary
fuente
Después de que la consulta se haya ejecutado correctamente, cómo almacenar el valor de un campo en una variable, por ejemplo. var_name = <query_name>. <field_name> ?
user12379095
@ user12379095 simplemente así:var_name = Employee.objects.all().values('eng_name','rank')
theQuestionMan
@ user12379095 y luego para usar este var_name - por ejemplo: imprima todos los nombres y rango de los empleados, puede hacer esto:for person in var_name: print(person['eng_name'] + " " + person['rank'])
theQuestionMan
3

La respuesta de Oskar Persson es la mejor manera de manejarlo porque hace que sea más fácil pasar los datos al contexto y tratarlos normalmente desde la plantilla a medida que obtenemos las instancias del objeto (fácilmente iterables para obtener accesorios) en lugar de una lista de valores simples.

Después de eso, puede obtener fácilmente el accesorio deseado:

for employee in employees:
    print(employee.eng_name)

O en la plantilla:

{% for employee in employees %}

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

{% endfor %}
PeteMaikel
fuente
1

Puede usar lista_valores junto con el filtro así;

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

Más detalles aquí

7guyo
fuente