如何获取所有行的查询集,其中每一行都有特定的字段?

问题描述 投票:0回答:9

我有一个模型

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

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

Employees.objects.all()

我想知道如何为每个查询集元素选择字段。我怎样才能做到这一点?

python django django-models django-queryset
9个回答
274
投票
Employees.objects.values_list('eng_name', flat=True)

这将创建所有

eng_name
的平面列表。如果您想要每行多个字段,则无法创建平面列表:这将创建一个元组列表:

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

48
投票

除了

values_list
作为 Daniel mentions 之外,您还可以使用
only
(或
defer
以获得相反的效果)来获取仅具有 id 和指定字段的对象的查询集:

Employees.objects.only('eng_name')

这将运行单个查询:

SELECT id, eng_name FROM employees

21
投票

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

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

8
投票

丹尼尔当场回答。如果您想查询多个字段,请执行以下操作:

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

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

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

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

3
投票

Oskar Persson 的答案是处理它的最佳方法,因为它可以更轻松地将数据传递到 context 并在我们获取对象实例(轻松迭代以获取 props)时从 template 正常处理它,而不是普通的值列表。

之后你就可以轻松获得想要的道具了:

for employee in employees:
    print(employee.eng_name)

或者在模板中:

{% for employee in employees %}

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

{% endfor %}

2
投票

您可以像这样将values_list与过滤器一起使用;

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

更多详情这里


2
投票
Employees.objects.filter().only('eng_name')

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

与SQL查询类似:

SELECT eng_name FROM Employees;

1
投票
queryset = ModelName.objects.filter().only('field1', 'field2')

0
投票

您还可以使用带有字段名称的列表

field_names = ['product_id', 'name', 'price', 'status']
results = ModelName.objects.all().values_list(*field_names)

# or for example
# results = ModelName.objects.all().values_list(*field_names, named=True)
© www.soinside.com 2019 - 2024. All rights reserved.