9

मैं name के साथ एक कुंजी बनाने की कोशिश कर रहा हूं और संबंधित User ऑब्जेक्ट के रूप में मानता हूं।dict समझ का उपयोग करते समय समस्याएं। NameError: वैश्विक नाम परिभाषित नहीं किया गया है

मैं Django खोल आवरण 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> 
} 

मुझे पता है, इसे पूरा करने के अन्य तरीके हैं, लेकिन मुझे उत्सुकता है कि क्यों धक्का समझते हैं आयन यहाँ काम नहीं कर रहे हैं।

कोई सुझाव?
क्या मुझे यहां कुछ याद आ रही है?

+0

मुझे ऐसा कोई मुद्दा नहीं दिख रहा है, तो आप कुछ याद कर रहे हैं! – Rohan

+0

हो सकता है कि शब्दकोश बंद करने के लिए समान नामस्थान को खोल के रूप में उपयोग नहीं किया जा रहा है। क्या यू यू = यूजर है; u = {name: नामों के नाम पर U.objects.get (उपयोगकर्ता नाम = नाम)} 'कोई फर्क पड़ता है? (बस सोच रहा है कि यह एक बग है) – Dunes

+0

@ रोहन, आप किस कदम का पालन कर रहे हैं? @ ड्यून्स, कोई भी काम नहीं करता है, मुझे 'नाम त्रुटि: वैश्विक नाम' यू 'परिभाषित नहीं किया गया है' –

उत्तर

2

मेरा मानना ​​है कि python's issue tracer आपके लिए सबसे अच्छा जवाब है।

संक्षेप में: यह खोल में काम नहीं करेगा। शैल में फ़ंक्शन परिभाषा पर भी लागू होता है। आयात वहां पहुंच योग्य नहीं हैं।

तुम्हारी समस्या के लिए संबंध में मैं सलाह देने के लिए:

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

यह len(names) में से एक एसक्यूएल क्वेरी बजाय करता है।

+0

हाँ, मुझे पता है कि यह करने का एक तरीका है, लेकिन मेरी समस्या अनुकूलन नहीं थी, लेकिन समझ :-) –

+0

क्या आपने इसे खोल के बाहर की कोशिश की है? –

+0

हां, जब मैं 'python manage.py shell --plain' करता हूं यह काम करता है! –

संबंधित मुद्दे

 संबंधित मुद्दे