2015-07-09 5 views
6

मैं एक निश्चित अनुप्रयोग विकसित करता हूं, जिसे मैंने निर्दिष्ट डेटाबेस और मॉडल स्कीमा के साथ पाया। मैं Django संस्करण 1.8.2 का उपयोग कर रहा हूँ। नीचे एक समस्या प्रस्तुत की गई है। अनावश्यक क्षेत्रों को छोड़ दिया गया है, उदाहरण के प्रयोजनों के लिए मॉडल नामों का आविष्कार किया गया है, क्योंकि मैं इसका खुलासा नहीं कर सकता। एक लंबे समय के बाद एक परियोजना संभावना एक ही नाम एक के कई है, लेकिन विभिन्न विदेशी कुंजी बी के साथ इस विशेष मामले में हो सकता है निम्नलिखित मॉडल एक पर विचार करें और बीप्राथमिक कुंजी बनाने के लिए Django में दो फ़ील्ड होते हैं?

class B (models.Model): 

     name = models.CharField(max_length=100) 

class A (models.Model): 

     name = models.CharField(max_length=100, primary_key=True) 
     related_name = models.ForeignKey(B, null=True, blank=True) 

, मैं चाहते हैं प्राथमिक कुंजी "ए" मॉडल में दो फ़ील्ड शामिल हैं: नाम और संबंधित नाम। इस तरह की एक कुंजी बनाने के लिए django में दो फ़ील्ड होते हैं?

+0

इस्तेमाल कर सकते हैं यह संभव है 'A' की प्राथमिक कुंजी बदलने के लिए Django डिफ़ॉल्ट' id' बजाय होने के लिए? यह स्पष्ट फिक्स की तरह लगता है। –

+0

हाय :-) आपके उत्तर के लिए धन्यवाद। यह एक अच्छा समाधान है, लेकिन मेरे मामले में कई तालिकाओं में एक विदेशी कुंजी तालिका "ए" है और डिफ़ॉल्ट आईडी में बदलना वास्तव में एक बड़ा प्रयास होगा। इसके अलावा, 'एबजेक्ट्सजेट (पीके = "कुछ") जैसे प्रश्नों का उपयोग करके बहुत सारे कोड और प्राथमिक कुंजी के प्रकार को बदलने के लिए बहुत सारे काम की आवश्यकता होती है। इस कारण से, मैं ऐसे समाधान की तलाश में हूं जो कुंजी प्रकार को नहीं बदलेगा। आधार में बहुत सा साल हैं। –

+0

ठीक है। उस मामले में मुझे नहीं लगता कि इसे डीजेंगो में हल किया जा सकता है। Django प्रत्येक उदाहरण के लिए एक एकल, अद्वितीय प्राथमिक कुंजी की आवश्यकता है। भले ही आप एक समग्र प्राथमिक कुंजी का उपयोग कर सकें, मुझे यकीन नहीं है कि यह एक अच्छा विचार है जब पीके में से एक फ़ील्ड एक शून्य विदेशी कुंजी है। –

उत्तर

3

आप एक समग्र कुंजी का उपयोग करना चाहते हैं। Django इस See here का समर्थन नहीं करता है। कुछ समर्थन है लेकिन आप संबंध नहीं रख सकते हैं, इसलिए यह व्यावहारिक उपयोग तक सीमित है।

Currently Django models only support a single column in this set, denying many designs where the natural primary key of a table is multiple columns. Django currently can't work with these schemas; they must instead introduce a redundant single-column key (a “surrogate” key), forcing applications to make arbitrary and otherwise-unnecessary choices about which key to use for the table in any given instance.

2

Django समग्र कुंजी का समर्थन नहीं करता है। लेकिन तुम unique-together

unique_together = ("name", "related_name") 
+0

जब मैं अद्वितीय रूप से उपयोग करता हूं, यह मानते हुए कि मॉडल प्रश्न में प्रस्तुत किए जाएंगे। मेटा-क्लास मॉडल के अतिरिक्त के बाद एक unique_together = ("name", "related_name"), मेरे पास नाम की दो पंक्तियां हो सकती हैं = "क्रिस" अलग-अलग फ़ील्ड से संबंधित नाम? मेरा मतलब यह है कि नाम फ़ील्ड primary_key पैरामीटर सत्य पर सेट है। –

+0

>>> एस = बीबजेक्ट्सक्रेट (नाम = "जन") >>> s.save() >>> डी = एबजेक्ट्सक्रेट (नाम = "स्टैज") >>> डी .save() >>> k = A.objects.create (name = "Stasze", related_name = s) वापसी डेटाबेस। कर्सर.एक्सक्यूट (स्वयं, क्वेरी, पैराम्स) django.db.utils.Integrity त्रुटि: UNIQUE बाधा विफल: test_comp_a.name –

+0

* यह एक समग्र पीके * नहीं है, याद रखें। आप 'ए' वर्ग में 'नाम' विशेषता का उपयोग पीके के रूप में कर रहे हैं और एक बार-बार ऑब्जेक्ट बना रहे हैं। यदि आपके पास कई 'ए' ऑब्जेक्ट्स में वही' नाम 'होगा, तो इसे पीके के रूप में उपयोग न करें, डिफ़ॉल्ट रूप से' ऑटोइनक्रिकमेंट 'का उपयोग करें और 'unique_together' चाल करेगा। – Gocht

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