我正在尝试创建一个密钥为name
的dict,并将值设置为对应的User
对象。
我使用的是来自Django shell wrapper python manage.py shell
的Python shell:
>>> from django.contrib.auth.models import User
>>> names = ['carl', 'jim', 'jack', 'john', 'mark']
# Now using some dict comprehension
>>> u = {name: User.objects.get(username=name) for name in names}
NameError: global name 'User' is not defined
然而,这对我有用:
u = {}
for name in names:
u[name] = User.objects.get(username=name)
我得到了所需的输出,即:
{
'carl': <User: carl>,
'jack': <User: jack>,
'jim' : <User: jim>,
'john': <User: john>,
'mark': <User: mark>
}
我知道,还有其他方法可以实现这一点,但我很好奇为什么dict理解不能在这里工作。
任何提示?
我在这里错过了什么吗?
答案 0 :(得分:2)
我相信python's issue tracer对你来说是最好的答案。
简而言之:它无法在shell中运行。这同样适用于shell中的函数定义。那里的进口是不可取的。
关于你的问题,我建议:
names = [...]
users = User.objects.filter(username__in=names)
name_to_user = {user.username: user for user in users}
它执行一个sql查询而不是len(names)
。