如何获取所有行的 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_names 的平面列表。如果您希望每行有多个字段,则不能制作平面列表:这将创建一个元组列表:

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 = . ? @user12379095 就像这样: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,每一行都有特定的字段?的主要内容,如果未能解决你的问题,请参考以下文章

Ext JS:获取特定行的操作列

获取javascript中动态行的特定列值

我如何只使用一行来获取“R”中该特定行的分位数

如何遍历 .dat 文件并将每组行的特定列附加到数组

c# DataGridView中,选中了多个行,如何获取选中的每一行的数据,或者每一行的索引?

对于 data.table 中的每一行,获取另一个 data.table 中匹配行的随机索引