How to obtain a QuerySet of all rows, with specific fields for each one of them?
Solution 1:
Employees.objects.values_list('eng_name', flat=True)
That creates a flat list of all eng_name
s. If you want more than one field per row, you can't do a flat list: this will create a list of tuples:
Employees.objects.values_list('eng_name', 'rank')
Solution 2:
In addition to values_list
as Daniel mentions you can also use only
(or defer
for the opposite effect) to get a queryset of objects only having their id and specified fields:
Employees.objects.only('eng_name')
This will run a single query:
SELECT id, eng_name FROM employees
Solution 3:
We can select required fields over values.
Employee.objects.all().values('eng_name','rank')
Solution 4:
Oskar Persson's answer is the best way to handle it because makes it easier to pass the data to the context and treat it normally from the template as we get the object instances (easily iterable to get props) instead of a plain value list.
After that you can just easily get the wanted prop:
for employee in employees:
print(employee.eng_name)
Or in the template:
{% for employee in employees %}
<p>{{ employee.eng_name }}</p>
{% endfor %}
Solution 5:
You can use values_list alongside filter like so;
active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)
More details here