2015-03-01 3 views
6

साथ बहुरूपी मॉडल मैं इन इस बेस मॉडल है कहते हैं कि चलो:Django unique_together

class Like(Trackable): 
    content = models.ForeignKey(Content, related_name='likes') 

    class Meta: 
     unique_together = ['content', 'created_by'] 

जब मैं माइग्रेशन चला, इसके बारे में शिकायत:

class Trackable(PolymorphicModel): 
    uuid = UUIDField(unique=True) 
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

और एक बच्चे को मॉडल यह फैली

django.db.models.fields.FieldDoesNotExist: Like has no field named u'created_by' 
+0

क्या आप चाहते हैं कि 'ट्रैक करने योग्य' अपनी खुद की तालिका हो, जो कि विदेशी कुंजी से 'लाइक' से संबंधित है? यदि नहीं, तो ['abstract = True'] (https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes) का उपयोग करें और आपका 'unique_together' अपेक्षित के रूप में काम करेगा। यदि ऐसा है, तो आप उस अद्वितीय को 'unique_together' के साथ लागू करने में सक्षम नहीं होंगे। –

+0

मुझे यकीन नहीं है कि जोड़कर यह https://github.com/chrisglass/django_polymorphic का उपयोग करके ठीक से काम करेगा क्योंकि मुझे यह मूल मॉडल में सार = सही का उपयोग करने के बारे में उल्लेख नहीं है। –

+0

मैंने उस प्रोजेक्ट पर देखा और ऐसा लगता है कि यह 'abstract = झूठी' विरासत के लिए डिज़ाइन किया गया है। इस मामले में आप दो अलग-अलग तालिकाओं के बारे में बात कर रहे हैं, जिससे 'अद्वितीय_एक साथ' का उपयोग करना असंभव हो जाता है। ध्यान दें कि 'abstract = True' बेहतर प्रदर्शन प्रदान करेगा और अद्वितीय बाधा की अनुमति देगा, इसलिए इस बारे में सोचें कि आपको वास्तव में एकाधिक तालिकाओं का उपयोग करने की आवश्यकता है या नहीं। –

उत्तर

2

यहां बताया गया है कि मैंने इस समस्या को कैसे संभाला। ध्यान रखें कि मैं पोस्टग्रेज़ को अपने डेटाबेस के रूप में उपयोग करता हूं और मुझे नहीं पता कि अन्य डेटाबेस के साथ समान समस्याएं होती हैं (हालांकि मुझे लगता है कि वे करते हैं)।

अद्वितीय एक साथ बाधाओं को केवल एक ही टेबल पर लागू किया जा सकता है या पोस्टग्रेस में देखा जा सकता है। इसका मतलब है कि बॉक्स से बाहर Django/Django-polymorphic एक विरासत पदानुक्रम में एक मूल तालिका और Django मॉडल की एक बाल तालिका दोनों क्षेत्रों के संयोजन पर डेटाबेस-लागू अद्वितीय बाधाओं को व्यक्त नहीं कर सकता है।

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

  1. प्रति किसी भी अभिभावक मॉडल क्षेत्रों है कि बच्चे की तालिका में अद्वितीय बाधा में शामिल हैं, और बच्चे के खेतों और माता-पिता से कॉपी किए गए फ़ील्ड, या
  2. बच्चे पर एक दृश्य बनाएं जिसमें माता-पिता और बच्चे के दोनों फ़ील्ड शामिल हैं, और इस दृश्य पर अद्वितीय बाधा व्यक्त करें।

आपको या तो मैन्युअल रूप से ऐसा करना होगा, या इन बाधाओं को स्वचालित रूप से डालने/बदलने/हटाने के लिए अपना स्वयं का ढांचा विकसित करना होगा।

+0

से पूछताछ करने की अनुमति देता है मुझे विश्वास है कि आप [विरासत मॉडल में पैरेंट-मॉडल फ़ील्ड कॉपी नहीं कर सकते] (https : //docs.djangoproject.com/en/1.10/topics/db/models/#field-name-hiding-is-not- निर्धारित) तो विकल्प 1 काम नहीं करता है। –

+0

आप मूल क्षेत्रों की प्रतिलिपि नहीं बना सकते हैं जैसे कि उनके पास Django में बाल मॉडल में समान फ़ील्डनाम है - लेकिन आप उन्हें बच्चे मॉडल में एक नए फ़ील्डनाम में कॉपी कर सकते हैं। मुझे लगता है कि आप कॉपी किए गए फ़ील्ड को सिंक में रखने की देखभाल करने के लिए डेटाबेस ट्रिगर सेट कर सकते हैं। उपरोक्त वर्णित अनुसार बाल मॉडल में प्रतिस्थापित क्षेत्र पर बाधा उत्पन्न की जाती है। (मैं यह सुंदर नहीं कह रहा हूं! लेकिन यह संभव है) – jcdude

+0

ओह, मैं वहां तर्क देखता हूं जो वास्तव में काम करेगा। आखिरकार अगर django_polymorphic को सार आधार मॉडल के साथ काम करने के लिए स्थापित किया गया था, तो यह एक साथ हैकिंग किए बिना काम करेगा लेकिन इसका समर्थन करने की कोई योजना नहीं प्रतीत होती है। –

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