Tengo una tabla / modelos llamados Employees
y 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?
python
django
django-models
Zentenk
fuente
fuente
SELECT col
lugar deSELECT *
?Respuestas:
Employees.objects.values_list('eng_name', flat=True)
Eso crea una lista plana de todos los
eng_name
s. 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')
fuente
Además de
values_list
como 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:only
defer
Employees.objects.only('eng_name')
Esto ejecutará una sola consulta:
fuente
Podemos seleccionar campos obligatorios sobre valores.
Employee.objects.all().values('eng_name','rank')
fuente
var_name = Employee.objects.all().values('eng_name','rank')
for person in var_name: print(person['eng_name'] + " " + person['rank'])
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 %}
fuente
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í
fuente