django模型选择单个字段


102

我有一个称为的表/模型Employees,我想将单个字段的所有行作为查询集。

我知道我可以这样做(希望我做得对):

emp_list = Employees.objects.get(all)
emp_names = emp_list.eng_name

是否要在数据库中查询所有字段并且仅使用一个字段?是否有更好(更快)的方法?


“仅使用一个”是什么意思?一个SELECT col代替SELECT *
西罗Santilli郝海东冠状病六四事件法轮功

Answers:


182
Employees.objects.values_list('eng_name', flat=True)

这将创建所有eng_names的平面列表。如果您希望每行多于一个字段,则不能做一个平面列表:这将创建一个元组列表:

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

感谢您的回答,如果我只选择1个或多个字段(不是全部)怎么办?
zentenk 2011年

抱歉,我不明白这个问题。
Daniel Roseman

3
请分享文件。这对其他人有帮助
bob marti 17-2-28

25

除了values_list丹尼尔 提到你也可以使用only(或defer为相反的效果),只得到有他们的ID和指定的字段对象的查询集:

Employees.objects.only('eng_name')

这将运行一个查询:

SELECT id, eng_name FROM employees

3
此命令返回我的Django 2.1.3版和python 3.6.2版的所有字段。
Ananthi

它将仅提取该字段,但是如果您尝试访问其他字段,将执行单独的数据库查询。因此,这是一种很好的优化技术,但请确保不要创建这些额外的查询。否则,您将失去性能而不是获得性能。
Eerik Sven Puudist

6

我们可以在值上选择必填字段。

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

查询成功运行后,如何将字段的值存储在变量中,例如。var_name = <查询名称>。<字段名称>
user12379095

@ user12379095就像这样:var_name = Employee.objects.all().values('eng_name','rank')
TheQuestionMan

@ user12379095,然后使用此var_name-例如:打印所有员工的姓名和职级,您可以执行以下操作:for person in var_name: print(person['eng_name'] + " " + person['rank'])
TheQuestionMan

3

Oskar Persson的答案是处理该数据的最佳方法,因为当我们获得对象实例(很容易迭代以获取道具)而不是简单的值列表时,可以更轻松地将数据传递到上下文并从模板正常对待数据。

之后,您可以轻松获得所需的道具:

for employee in employees:
    print(employee.eng_name)

或在模板中:

{% for employee in employees %}

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

{% endfor %}

1

您可以像这样在过滤器旁边使用values_list;

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

在这里更多细节

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.