9

我正在尝试创建一个以键为name和值作为对应User对象的字典。

我正在使用来自 Django shell wrapper 的 Python shell python manage.py 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 理解在这里不起作用。

有小费吗?
我在这里错过了什么吗?

4

1 回答 1

2

我相信python 的问题跟踪器是你最好的答案。

简而言之:它不会在 shell 中工作。这同样适用于 shell 中的函数定义。那里无法进口。

关于您的问题,我建议:

names = [...]
users = User.objects.filter(username__in=names)
name_to_user = {user.username: user for user in users}

它执行一个 sql 查询而不是len(names).

于 2012-10-30T08:50:40.660 回答