我有一个模型
Employees
,我想要一个包含所有行的查询集,但每行都有一些特定字段,而不是所有字段。
我知道如何查询表/模型中的所有行:
Employees.objects.all()
我想知道如何为每个查询集元素选择字段。我怎样才能做到这一点?
Employees.objects.values_list('eng_name', flat=True)
这将创建所有
eng_name
的平面列表。如果您想要每行多个字段,则无法创建平面列表:这将创建一个元组列表:
Employees.objects.values_list('eng_name', 'rank')
我们可以选择必填字段而不是值。
Employee.objects.all().values('eng_name','rank')
丹尼尔当场回答。如果您想查询多个字段,请执行以下操作:
Employee.objects.values_list('eng_name','rank')
这将返回元组列表。查询多个字段时不能使用named=Ture。
此外,如果您知道只有一个字段包含该信息,并且您知道 pk id,请执行以下操作:
Employee.objects.values_list('eng_name','rank').get(pk=1)
Oskar Persson 的答案是处理它的最佳方法,因为它可以更轻松地将数据传递到 context 并在我们获取对象实例(轻松迭代以获取 props)时从 template 正常处理它,而不是普通的值列表。
之后你就可以轻松获得想要的道具了:
for employee in employees:
print(employee.eng_name)
或者在模板中:
{% for employee in employees %}
<p>{{ employee.eng_name }}</p>
{% endfor %}
您可以像这样将values_list与过滤器一起使用;
active_emps_first_name = Employees.objects.filter(active=True).values_list('first_name',flat=True)
更多详情这里
Employees.objects.filter().only('eng_name')
这将给出所有行的查询集,但仅包含指定的字段。它没有像上面的其他答案那样给出一个列表。它为您提供对象实例。小心;它是objects.filter().only()而不仅仅是objects.only()
与SQL查询类似:
SELECT eng_name FROM Employees;
queryset = ModelName.objects.filter().only('field1', 'field2')
您还可以使用带有字段名称的列表
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)