Django

10

में विदेशी कुंजी की सूची के साथ PostgreSQL फ़ील्ड बनाने की कोशिश कर रहा है, मैं यह करने की कोशिश कर रहा हूं: Django में एक मॉडल बनाएं जो एक PostgreSQL सरणी (डेटाबेस विशिष्ट प्रकार) है, जिसमें किसी अन्य को विदेशी कुंजी शामिल है आदर्श।Django

SystemCheckError: System check identified some issues:

ERRORS:

my_app.Books.authors: (postgres.E002) Base field for array cannot be a related field.

कि हरा करने के लिए कैसे पर कोई विचार:

class Books(models.Model): 
authors = ArrayField(
    models.ForeignKey('my_app.Authors', default=None, null=True, blank=True), 
    blank=True, 
    default=list() 
) 

मैं makemigrations करने का प्रयास करते, जैंगो मुझे इस त्रुटि देता है?

+0

इस उद्देश्य के लिए आपको 'ManyToMany' फ़ील्ड का उपयोग करना चाहिए। – Selcuk

उत्तर

10

आप विदेशी कुंजी की एक सरणी नहीं बना सकते हैं। यह एक Django सीमा नहीं है, यह एक PostgreSQL "सीमा" है।

कारण यह है कि एक विदेशी कुंजी एक प्रकार नहीं है, यह एक क्षेत्र पर एक बाधा है। विदेशी कुंजी की एक सरणी कोई सेंसर नहीं बनाती है।

सामान्य दृष्टिकोण इस लक्ष्य को हासिल करने के लिए एक मध्यवर्ती मेज कि दो अन्य लोगों के बीच एक कड़ी के रूप में इस्तेमाल किया जाएगा उपयोग करने के लिए है:

Authors(id, name) 
Books(id, title, pub_date) 
BookAuthors(id, book_id, author_id) 

ऊपर उदाहरण में, BookAuthors.book_idBooks.id और BookAuthors.author_id के लिए एक विदेशी कुंजी एक है Authors.id पर विदेशी कुंजी। इस प्रकार, तालिका BookAuthors का उपयोग किसी लेखक के साथ एक पुस्तक और इसके विपरीत मिलान करने के लिए किया जाता है।

Django ManyToManyField fields के साथ इस मध्यवर्ती मेज सार:

class Authors(models.Model): 
    name = models.CharField(...) 

class Books(models.Model): 
    title = models.CharField(...) 
    pub_date = models.DateField(...) 
    authors = models.ManyToManyField('my_app.Authors', 
            related_name='authored_books') 

परदे के पीछे, Django मध्यवर्ती तालिका का निर्माण करेगा।

फिर, आप का उपयोग करके किसी पुस्तक के सभी लेखकों को प्राप्त कर सकते हैं, या author.authored_books.all() का उपयोग कर लेखक द्वारा लिखी गई सभी पुस्तकें प्राप्त कर सकते हैं।

+0

यह समझ में आता है। धन्यवाद! मैं केवल उन मानों का उपयोग करूंगा जो इसके बजाय विदेशी कुंजी के रूप में नहीं हैं। मैं प्रदर्शन के बारे में कुछ चिंतित हूं और केवल एक ही चूना मुझे इन संबंधित कुंजी की आवश्यकता है जब मैं इस ऑब्जेक्ट को स्वयं चुनता हूं। – Danil

+0

मुझे लगता है कि आपको अभी भी कई से अधिक संबंध होना चाहिए। मैं आप पूर्णांक की एक सरणी सेट करते हैं, तो आप शायद कई परेशानियों में जायेंगे। विशेष रूप से डेटा अखंडता के बारे में। मैं प्रदर्शन के साथ समस्या नहीं देख सकता। –

0

आपको ManyToManyField, ArrayField का उपयोग किसी अन्य मॉडल से संबंधित नहीं किया जा सकता है।