【发布时间】:2015-11-19 23:04:45
【问题描述】:
Django:如何获取所有员工用户的查询集?
我正在尝试:
staff = User.objects.get(is_staff=True)
但得到一个 TypeError:
'User' object is not iterable
【问题讨论】:
标签: python django django-queryset django-orm
Django:如何获取所有员工用户的查询集?
我正在尝试:
staff = User.objects.get(is_staff=True)
但得到一个 TypeError:
'User' object is not iterable
【问题讨论】:
标签: python django django-queryset django-orm
get 用于返回单个对象——而不是查询集。如果它从数据库返回多个条目,它将给出错误。在您的情况下,我猜它正在返回一个用户,而您正在尝试对其进行迭代。
过滤器是您想要使用的。它返回一个可以迭代的查询集。
staff = User.objects.filter(is_staff=True)
for person in staff :
do stuff....
【讨论】:
关键是在使用 staff = User.objects.get(is_staff=True) 时,您不能确定它会返回单个用户(除非您确定)。
您可能希望添加更多条件以将选项范围缩小到一个。
一个更安全的选择是用户filter,它返回一个符合条件的用户列表,当事情不符合预期时不需要异常处理objects.get
【讨论】:
get in a queryset 是获取特定对象的值,不可迭代。
user = User.objects.get(id=2)
它为您提供 id 为 2 的用户对象。只能有 1 个 id 为 2 的用户
但在您的情况下,可能会有很多具有员工身份的用户
staff = User.objects.filter(is_staff=True)
这会为您提供员工列表。如果您正在寻找一个对象,则使用 get 如果寻找列表则使用过滤器。
您现在可以像这样在模板中使用它
{% for stf in staff %}
{{stf.username}}
{% endfor %}
【讨论】:
使用filter 代替get。
staff = User.objects.filter(is_staff=True)
【讨论】: