如何获得包含所有行的 QuerySet,以及每行的特定字段?

我有一个模型 Employees,我希望有一个所有行的 QuerySet,但是每一行都有一些特定的字段,而不是所有的字段。

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

Employees.objects.all()

我想知道如何为每个 Queryset 元素选择字段?

161509 次浏览
Employees.objects.values_list('eng_name', flat=True)

这将创建一个包含所有 eng_name的平面列表。如果每行需要多个字段,则不能执行平面列表: 这将创建一个元组列表:

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

除了 values_list作为 丹尼尔 提到之外,你还可以使用 only(或者 defer作为相反的效果)来获得一个只有 id 和指定字段的对象查询集:

Employees.objects.only('eng_name')

这将运行一个查询:

SELECT id, eng_name FROM employees

我们可以选择需要的字段而不是值。

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

奥斯卡 · 佩尔松的回答是处理这个问题的最佳方法,因为这样可以更容易地将数据传递给 背景,并且在我们获得对象实例(很容易迭代以获得道具)而不是一个普通的值列表时,通常从 模板处理数据。

在那之后,你可以很容易地得到想要的道具:

for employee in employees:
print(employee.eng_name)

或者在模板中:

{% for employee in employees %}


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


{% endfor %}

您可以像这样在过滤器旁边使用 value _ list;

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

更多细节 给你

Daniel 回答正确,如果你想查询不止一个字段,可以这样做:

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

这将返回元组列表。当查询多个字段时,不能使用 name = Ture。

此外,如果你知道只有一个字段存在的信息,你知道的 pkid 然后这样做:

Employee.objects.values_list('eng_name','rank').get(pk=1)
Employees.objects.filter().only('eng_name')

这将为所有行提供一个 QuerySet,但只包含指定的字段。它不会像上面的其他答案一样给出一个列表。它给你的对象实例。注意,它是 objects.filter ()。Only ()不仅仅是对象

它类似于 SQL Query:

SELECT eng_name FROM Employees;
queryset = ModelName.objects.filter().only('field1', 'field2')