9

Próbuję utworzyć klucz z kluczem jako name i wartość jako odpowiadający obiekt User.Problemy podczas korzystania ze słów Dict. NameError: nazwa globalna nie jest zdefiniowana

Używam Pythona powłokę Django powłoki owijki 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 

jednak działa to dla mnie:

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

i uzyskać pożądany wynik, który jest:

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

Wiem, są inne sposoby, aby to osiągnąć, ale jestem ciekawy, dlaczego dyktuje to zrozumienie jony nie działają tutaj.

Jakieś wskazówki?
Czy brakuje mi tutaj czegoś?

+0

Nie widzę żadnego problemu, być może czegoś brakuje! – Rohan

+0

Może być tak, że zamknięcie słownika nie uzyskuje dostępu do tej samej przestrzeni nazw co powłoka. Czy 'U = Użytkownik; u = {nazwa: U.objects.get (nazwa_użytkownika = nazwa) dla nazwy w nazwach} 'czy masz jakąkolwiek różnicę? (tylko zastanawiam się, czy to błąd) – Dunes

+0

@Rohan, jakie kroki podążasz? @Dunes, nie, to też nie działa, otrzymuję komunikat "NameError: nazwa globalna" U "nie jest zdefiniowana" –

Odpowiedz

2

Wierzę, że python's issue tracer jest najlepszą odpowiedzią dla Ciebie.

Krótko mówiąc: nie będzie działać w powłoce. To samo dotyczy definicji funkcji w powłoce. Import jest tam nieosiągalny.

W odniesieniu do problemu radzę:

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

Czyni zamiast jednego zapytania SQL len(names).

+0

Tak, wiem, że to sposób, aby to zrobić, ale moim problemem nie była optymalizacja, ale zrozumienie :-) –

+0

Wypróbowałeś to teraz poza powłoką? –

+0

Tak, kiedy robię 'python manage.py shell --plain' działa! –

Powiązane problemy