2009-04-28 8 views
5

जब मैं यह कर मैं मैं models.pyक्या मॉड्यूल.py (Django/पायथन) में घोषणा का मामला है?

class ZipCode(models.Model): 
    zip = models.CharField(max_length=20) 
    cities = City.objects.filter(zip=self).distinct() 

class City(models.Model): 
    name = models.CharField(max_length=50) 
    slug = models.CharField(max_length=50) 
    state = models.ForeignKey(State) 
    zip = models.ManyToManyField(ZipCode) 

में कुछ इस तरह है:

NameError: name 'City' is not defined 

इस है क्योंकि घोषणा का क्रम महत्वपूर्ण? और यदि हां, तो मैं यह कैसे कर सकता हूं, क्योंकि जिस तरह से मैं इसे व्यवस्थित करता हूं, ऐसा लगता है कि मुझे नेमरर प्राप्त करने जा रहा है।

धन्यवाद।

उत्तर

2

हाँ आदेश अन्य बातों के साथ मायने रखता है।

हालांकि, इस मुद्दे का सामना करना लगभग हमेशा संकेत है कि आप कुछ गलत कर रहे हैं।

इस मामले में अपने घोषणा:

cities = City.objects.filter(zip=self).distinct() 

... दोनों redundant और बुरे व्यवहार है। आप अपने ज़िप में उस ज़िप कोड के शहर_सेट का जिक्र करके एक ज़िप कोड से संबंधित शहरों को ढूंढ सकते हैं (यानी आपके मॉडल में नहीं!)। तो अगर जिप ज़िपकोड का एक उदाहरण है, आप क्या करेंगे:

cities = zip.city_set.all() 

तुम सच में यह शहरों 'नहीं बल्कि' city_set 'की तुलना में कॉल करने के लिए आप अपने M2M घोषणा में related_name पैरामीटर का उपयोग कर सकते हैं।

0

पायथन में ऑर्डर महत्वपूर्ण है। This thread आपके प्रश्न के लिए प्रासंगिक हो सकता है। आपके उपयोग के लिए, आप ज़िप कोड कक्षा में एक अद्वितीय विदेशी कुंजी का उपयोग करना चाह सकते हैं।

2

हां, आदेश मायने रखता है, लेकिन आपका उदाहरण मेरे लिए सही नहीं लग रहा है। कई-से-एक Django मॉडल के साथ रिश्तों पर

cities = models.ForeignKey(City) 

This has the details: मुझे लगता है तुम सिर्फ अपने कई-से-एक रिश्ते के लिए एक विदेशी कुंजी का उपयोग किया जाना चाहिए।

संपादित करें:

यह टिप्पणी यूरोप में शहरों में एक ही ज़िप कोड में कई शहरों में हो सकता है मेरे लिए कहा गया था। आप यहाँ देख रहे हैं एक बहुत-से-अनेक संबंध के लिए, आप का उपयोग करना चाहिए:

cities = models.ManyToManyField(City) 

यह Django's documentation में वर्णित है। मुद्दा यह है कि, उदाहरण में उपयोग किए जाने वाले कार्यों की तुलना में यह इनमें से कोई भी उदाहरण स्पष्ट है।

+1

हाय शेन, आपका सुझाव यह इंगित करता है कि एक ज़िप कोड केवल एक शहर से जुड़ा जा सकता है, लेकिन मैंने सोचा कि ज़िप कोड एक से अधिक शहरों से संबंधित हो सकते हैं और एक शहर में एकाधिक ज़िप कोड हो सकते हैं। क्या यह मामला नहीं है? – rick

+0

नहीं, आपके पास कई से एक रिश्ते हो सकते हैं, लेकिन मैं यहां इस्तेमाल किए गए वाक्यविन्यास से परिचित नहीं हूं। मैंने ऊपर दिए गए लिंक के मुताबिक: "कई से एक रिश्ते को परिभाषित करने के लिए, विदेशीकी()" –

+0

का उपयोग करें कई से एक और कई से कई अलग-अलग संबंध हैं, शेन। इस मामले में शायद एक से अधिक ज़िप कोड के रूप में अधिक से अधिक उपयुक्त कई शहरों का प्रतिनिधित्व कर सकते हैं (अंतरराष्ट्रीय स्तर पर सोच रहे हैं)। हालांकि यह बिंदु के अलावा है। दोनों दिशाओं में एक बाइनरी रिश्ते को घोषित करना एक बुरा विचार है, और अनावश्यक है। – ozan

5

आप के बाद परिभाषित वर्गों के लिए संदर्भ है, तो आप इस चाल का उपयोग कर सकते हैं:

attribute = models.ForeignKey('ClassDefinedAfterThis') 
+0

हालांकि यह काम करेगा? शहरों = 'शहर' .objects.filter (ज़िप = स्वयं)। डिस्टिंक() – rick

+0

उनकी स्थिति उस बिंदु पर कोई फर्क नहीं पड़ता – phillc

+2

@rick: नहीं, यह काम नहीं करेगा। –

3

मैं एक बार आदेश के बारे में चिंतित था ... क्योंकि मैं नीचे अपने मॉडल सकता है केवल संदर्भ मॉडल ऊपर सोचा। लेकिन फिर एहसास हुआ कि आप केवल

models.ForeignKey('appName.modelName') 

और सभी ठीक थे।

+0

यह नहीं ..... – alexvassel

6
आदेश से संबंधित समस्याओं से

अलावा, यह गलत है:

cities = City.objects.filter(zip=self).distinct() 

यह एक विधि के अंदर नहीं है, तो "स्व" भी अपरिभाषित हो जाएगा। इसे कक्षा निर्माण समय पर केवल एक बार निष्पादित किया जाता है (यानी जब मॉड्यूल पहली बार आयात किया जाता है), इसलिए बनाई गई विशेषता क्लास विशेषता होगी और सभी उदाहरणों के लिए समान मूल्य होगी। क्योंकि यह एक विधि है, जो मार डाला नहीं है जब तक यह तक पहुँचा है, मुद्दों आदेश देने अब एक समस्या होगी अंदर है

@property 
def cities(self): 
    return City.objects.filter(zip=self).distinct() 

: क्या आप के लिए देख रहा हो सकता है यह है। ozan बताते हैं, यह क्या Django संबंधों रिवर्स की एक दोहराव है पहले से ही मुक्त करने के लिए आप दे:

a_zip_code.city_set.all() 

और तुम related_name उपयोग कर सकते हैं इसे कहते हैं तुम क्या पसंद:

zip = models.ManyToManyField(ZipCode, related_name='cities') 
... 
a_zip_code.cities.all() 

तो मैं डॉन ' आपको लगता है कि मूल रूप से पूछे जाने वाले ऑर्डरिंग मुद्दे को आपकी स्थिति के लिए भी प्रासंगिक नहीं है। जब ऐसा होता है, तो दूसरों ने पहले ही विदेशीकी और कई टोमनीफिल्ड घोषणाओं में उद्धृत तारों का उपयोग करके इसकी ओर इशारा किया है।

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