我有一个名为Employees
的表/模型,我想将单个字段的所有行作为查询集。
我知道我可以这样做(希望我能做到这一点):
emp_list = Employees.objects.get(all)
emp_names = emp_list.eng_name
会在数据库中查询所有字段并仅使用一个字段吗?有没有更好(更快)的方法呢?
答案 0 :(得分:112)
Employees.objects.values_list('eng_name', flat=True)
创建所有eng_name
的平面列表。如果你想要每行多个字段,你就不能做一个平面列表:这将创建一个元组列表:
Employees.objects.values_list('eng_name', 'rank')
答案 1 :(得分:13)
除了values_list
Daniel mentions之外,您还可以使用only
(或defer
获得相反的效果)来获取对象的查询集拥有他们的id和指定字段:
Employees.objects.only('eng_name')
这将运行一个查询:
SELECT id, eng_name FROM employees
答案 2 :(得分:2)
您可以像这样在过滤器旁边使用values_list;
active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)
更多详细信息here
答案 3 :(得分:1)
我们可以在值上选择必填字段。
MemoryError
答案 4 :(得分:1)
奥斯卡·佩尔森(Oskar Persson)的答案是处理该问题的最佳方法,因为当我们获得对象时,它可以更轻松地将数据传递到上下文并按照 template 实例(很容易获得道具),而不是简单的值列表。
之后,您可以轻松获得所需的道具:
for employee in employees:
print(employee.eng_name)
或在模板中:
{% for employee in employees %}
<p>{{ employee.eng_name }}</p>
{% endfor %}
答案 5 :(得分:0)
Daniel的答案就在现场。如果要查询多个字段,请执行以下操作:
process.env
这将显示元组列表。查询多个字段时,不能使用named = Ture。
此外,如果您知道该信息仅存在一个字段,并且知道pk ID,则请执行以下操作:
dotenv
答案 6 :(得分:0)
Employees.objects.filter().only('eng_name')
这将给出所有行的查询集,但只有指定的字段。它没有像上面的其他答案那样给出一个列表。它给你的对象实例。小心;它是 objects.filter().only() 而不仅仅是 objects.only()
它类似于 SQL 查询:
SELECT eng_name FROM Employees;