Django आत्म-संदर्भित विदेशी कुंजी


165

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

class CategoryModel(models.Model):
    parent = models.ForeignKey(CategoryModel)

मैं यह कैसे करु? धन्यवाद!


2
स्थिर रूप से, मैं parentइसके बजाय इसे कॉल करने का सुझाव दूंगा parentId, क्योंकि my_category_model.parentइसका एक उदाहरण होगा CategoryModel। Django स्वचालित रूप से एक सदस्य बनाएगा parent_idजो संबंधित मॉडल की प्राथमिक कुंजी होगा।
15

जवाबों:


262

आप फॉरेनकेय को एक मॉडल के नाम पर स्ट्रिंग के रूप में पास कर सकते हैं और यह सही काम करेगा।

इसलिए:

parent = models.ForeignKey("CategoryModel")

या आप स्ट्रिंग "स्व" का उपयोग कर सकते हैं

parent = models.ForeignKey("self")

55

आप सेल्फ-रेफरेंस को इंगित करने के लिए स्ट्रिंग 'सेल्फ' का उपयोग कर सकते हैं।

class CategoryModel(models.Model):
    parent = models.ForeignKey('self')

https://docs.djangoproject.com/en/dev/ref/models/fields/#foreignkey


7
मुझे लगता है कि आप 'स्व' का मतलब है। जैसे कि स्ट्रिंग में। आत्म इस संदर्भ में अपरिभाषित है
जारेड फोर्सिथ

1
@ ब्रेंडन आपके जवाब में 'स्व' कैसा है, इस बात से अलग क्या है? "मुझे लगता है कि आप 'स्वयं" का मतलब है !!! । दोनों स्ट्रिंग हैं जो django डॉक्स के अनुसार ठीक है। ! किसी भी संकेत
स्ट्राइकर 3

1
अंतर यह है कि selfमॉडल संपत्ति को परिभाषित करते समय मौजूद नहीं है। यदि संपत्ति को __init__()या किसी अन्य विधि के हिस्से के रूप में परिभाषित किया जा रहा था , तो यह होगा, जैसा selfकि पायथन वर्ग के किसी भी उदाहरण विधि के लिए हमेशा पहला स्थितिगत तर्क होता है।
ब्रैंडन


1

आप अशक्त = सत्य और रिक्त = सत्य को भी निपटाते हैं

class CategoryModel(models.Model):
    parent = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True)

null = True, डेटाबेस को
खाली करने के लिए = True, फॉर्म वेलिडेशन में अनुमति देने के लिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.