9

name anahtarlı bir dict oluşturmaya ve User nesnesine karşılık gelen bir değer oluşturmaya çalışıyorum.Dict anlamalarını kullanırken sorunlar. NameError: global adı tanımlı değil

Django kabuk sarmalayıcı python manage.py shell Python kabuğu kullanıyorum:

u = {} 
for name in names: 
    u[name] = User.objects.get(username=name) 

Ve istenen çıktıyı almak:

>>> 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 

Ancak bu benim için çalışıyor

{ 
    'carl': <User: carl>, 
    'jack': <User: jack>, 
    'jim' : <User: jim>, 
    'john': <User: john>, 
    'mark': <User: mark> 
} 

Biliyorum, bunu başarmanın başka yolları var, ama merak ettiğim neden dict anlaşılıyor iyonlar burada çalışmıyor.

Herhangi bir ipucu?
Burada bir şey özlüyor muyum?

+0

Böyle bir sorun görmüyorum, bir şeyleri kaçırıyor olabilirsiniz! – Rohan

+0

Sözlük kapatmanın kabukla aynı ad alanına erişememesi olabilir. 'U = Kullanıcı; u = {name: U.objects.get (kullanıcı adı = isim) isim isimleri için} 'herhangi bir fark yaratır mısınız? (Sadece bir hata olup olmadığını merak ediyorum) – Dunes

+0

@Rohan, takip ettiğiniz adımlar neler? @Dunes, hayır ya işe yaramıyor, 'NameError: global name 'U' tanımlı değil ' –

cevap

2

python's issue tracer'un sizin için en iyi yanıt olduğuna inanıyorum.

Kısaca: Kabukta çalışmayacak. Aynı şey kabuktaki işlev tanımı için de geçerlidir. İthalatlar burada kabul edilemez. Sorununuz için bağlamda

Ben tavsiye:

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

O len(names) biri sql sorgusu yerine yapar.

+0

Evet, bunu yapmanın bir yolu olduğunu biliyorum, ama benim sorunum optimizasyon değil, anlama :-) –

+0

O zaman kabuğun dışında denedin mi? –

+0

Evet, python manage.py kabuğunu oluşturduğumda - çalışır! –