如何获取所有行的 QuerySet,每一行都有特定的字段?
Posted
技术标签:
【中文标题】如何获取所有行的 QuerySet,每一行都有特定的字段?【英文标题】:How to obtain a QuerySet of all rows, with specific fields for each one of them? 【发布时间】:2011-11-22 03:02:17 【问题描述】:我有一个模型 Employees
,我想要一个包含所有行的 QuerySet,但每行包含一些特定字段,而不是所有字段。
我知道如何从表/模型中查询所有行:
Employees.objects.all()
我想知道如何为每个 Queryset 元素选择字段。我该怎么做?
【问题讨论】:
“只使用一个”是什么意思?SELECT col
而不是 SELECT *
?
【参考方案1】:
Employees.objects.values_list('eng_name', flat=True)
这将创建一个包含所有 eng_name
s 的平面列表。如果您希望每行有多个字段,则不能制作平面列表:这将创建一个元组列表:
Employees.objects.values_list('eng_name', 'rank')
【讨论】:
感谢您的回答,如果我只想选择 1 个或多个字段(不是全部)怎么办? 对不起,我不明白这个问题。 请分享文档,对他人有帮助 values_list 是返回字典相似的值还是对象?【参考方案2】:除了values_list
和Daniel mentions 之外,您还可以使用only
(或defer
获得相反的效果)来获取仅具有其id 和指定字段的对象的查询集:
Employees.objects.only('eng_name')
这将运行一个查询:
SELECT id, eng_name FROM employees
【讨论】:
此命令返回我的 Django 2.1.3 版和 python 3.6.2 版的所有字段。 它只会获取这个字段,但是如果您尝试访问其他字段,则会执行单独的数据库查询。所以这是一种很好的优化技术,但请确保不要创建这些额外的查询。否则你将失去性能而不是获得它。 only 和 values 的区别是 only 也获取 id。【参考方案3】:我们可以选择必填字段而不是值。
Employee.objects.all().values('eng_name','rank')
【讨论】:
查询运行成功后,如何将字段的值存储在变量中,例如: var_name =var_name = Employee.objects.all().values('eng_name','rank')
@user12379095 然后使用这个 var_name - 例如:打印所有员工的姓名和排名,你可以这样做:for person in var_name: print(person['eng_name'] + " " + person['rank'])
【参考方案4】:
Oskar Persson 的回答是处理它的最佳方式,因为它可以更轻松地将数据传递到 context 并在我们获取对象时从 template 正常处理它实例(易于迭代以获取道具)而不是普通值列表。
之后你就可以轻松获得想要的道具了:
for employee in employees:
print(employee.eng_name)
或者在模板中:
% for employee in employees %
<p> employee.eng_name </p>
% endfor %
【讨论】:
【参考方案5】:您可以像这样在过滤器旁边使用 values_list;
active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)
更多详情here
【讨论】:
【参考方案6】:Daniel 答案就在现场。如果您想查询多个字段,请执行以下操作:
Employee.objects.values_list('eng_name','rank')
这将返回元组列表。查询多个字段时不能使用named=Ture。
此外,如果您知道该信息仅存在一个字段并且您知道 pk id,请执行以下操作:
Employee.objects.values_list('eng_name','rank').get(pk=1)
【讨论】:
【参考方案7】:Employees.objects.filter().only('eng_name')
这将给出所有行的 QuerySet,但只有指定的字段。它没有像上面的其他答案那样给出一个列表。它为您提供了对象实例。小心;它是 objects.filter().only() 而不仅仅是 objects.only()
类似于 SQL 查询:
SELECT eng_name FROM Employees;
【讨论】:
以上是关于如何获取所有行的 QuerySet,每一行都有特定的字段?的主要内容,如果未能解决你的问题,请参考以下文章