9

nameキーを対応するUserオブジェクトとして値を使用して辞書を作成しようとしています。

Django shell wrapper の Python シェルを使用しています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>
}

これを達成する他の方法があることは知っていますが、なぜ辞書内包表記がここで機能しないのか興味があります。

任意のヒント?
ここで何か不足していますか?

4

1 に答える 1

2

pythonの問題トレーサーがあなたにとって最良の答えだと思います。

要するに、シェルでは機能しません。同じことがシェルでの関数定義にも当てはまります。そこではインポートにアクセスできません。

あなたの問題に関して、私はアドバイスします:

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

の代わりに 1 つの SQL クエリを実行しますlen(names)

于 2012-10-30T08:50:40.660 に答える