Python 如何获取所有行的查询集,以及每一行的特定字段?

Python 如何获取所有行的查询集,以及每一行的特定字段?,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,我有一个模型Employees,我想有一个所有行的查询集,但每行都有一些特定字段,而不是所有字段 我知道如何查询表/模型中的所有行: Employees.objects.all() 我想知道如何为每个Queryset元素选择字段。我该怎么做 Employees.objects.values_list('eng_name', flat=True) 这将创建一个包含所有eng_names的平面列表。如果希望每行有多个字段,则不能使用平面列表:这将创建元组列表: Employees.objects

我有一个模型
Employees
,我想有一个所有行的查询集,但每行都有一些特定字段,而不是所有字段

我知道如何查询表/模型中的所有行:

Employees.objects.all()
我想知道如何为每个Queryset元素选择字段。我该怎么做

Employees.objects.values_list('eng_name', flat=True)
这将创建一个包含所有
eng_name
s的平面列表。如果希望每行有多个字段,则不能使用平面列表:这将创建元组列表:

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

除了
values\u list
,您还可以使用(或用于相反的效果)获取仅具有id和指定字段的对象的查询集:

Employees.objects.only('eng_name')
这将运行单个查询:

SELECT id, eng_name FROM employees

我们可以选择必填字段而不是值

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

Oskar Persson的答案是处理它的最佳方式,因为它可以更容易地将数据传递到上下文,并在获得对象实例(很容易获得道具)而不是简单的值列表时从模板正常处理数据

之后,您可以轻松获得想要的道具:

for employee in employees:
    print(employee.eng_name)
或在模板中:

{% for employee in employees %}

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

{% endfor %}
{employees%中的员工百分比]
{{employee.eng_name}

{%endfor%}
您可以像这样使用过滤器旁边的值列表

active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)
更多细节

答案就在眼前。如果要查询多个字段,请执行以下操作:

Employee.objects.values_list('eng_name','rank')
这将返回元组列表。查询多个字段时不能使用named=true

此外,如果您知道只有一个字段包含该信息,并且您知道pk id,则执行以下操作:

Employee.objects.values_list('eng_name','rank').get(pk=1)
这将给出所有行的查询集,但只包含指定的字段。它不像上面的其他答案那样给出一个列表。它为您提供对象实例。小心它是objects.filter().only()而不仅仅是objects.only()

它类似于SQL查询:

SELECT eng_name FROM Employees;

感谢您的回答,如果我只想选择一个或多个字段(不是全部),该怎么办?对不起,我不理解这个问题。请共享文档。这将有助于其他人“只使用一个”是什么意思?A
SELECT col
而不是
SELECT*
?此命令将返回Django 2.1.3版和python 3.6.2版的所有字段。它将仅获取这一个字段,但如果您尝试访问其他字段,将执行单独的数据库查询。因此,这是一种很好的优化技术,但请确保不要创建这些额外的查询。否则,您将失去性能而不是获得性能。在查询成功运行后,如何将字段的值存储在变量中,例如var_name=@user12379095就像这样:
var\u name=Employee.objects.all().values('eng\u name','rank')
@user12379095然后使用这个var\u名称-例如:打印所有员工的姓名和等级,您可以这样做:
对于var\u name中的人:打印(person['eng\u name'+''+person['rank'])
SELECT eng_name FROM Employees;