2011-01-14 16 views
7

Django का ForeignRelatedObjectsDescriptor.create_manager(...) फ़ंक्शन गतिशील रूप से RelatedManager कक्षाएं बनाता है और बाद में गतिशील रूप से बनाए गए वर्ग का एक उदाहरण प्रारंभ करता है।Django के संबंधित प्रबंधक विधियों को ओवरराइड करना

यदि मैं RelatedManager.add(...) विधि को ओवरराइड करना चाहता हूं, तो मैं इसे कैसे करूँगा?

RelatedManager कक्षाएं फ़ाइल में बनाई गई हैं: django/db/models/fields/related.py

कैसे मैं एक कस्टम RelatedManager है उपयोग करना चाहते हैं का एक उदाहरण ...

class Record(Model): 
    string = CharField() 
class Managed(Model): 
    record = ForeignKey('Record') 
    boolean = BooleanField() 
def view_function(...): 
    record = Record(string='Example') 
    record.save() 
    record.managed_set.add(Managed(boolean=True)) # How to override add()? 

कोई सुझाव की सराहना की जाएगी।

उत्तर

3

मुझे यकीन नहीं है कि आपको ओवरराइड की आवश्यकता है - डिफ़ॉल्ट क्वेरीसेट पहले से ही वही करता है जो आप चाहते हैं।

लेकिन सवाल का जवाब देने के लिए, आप मॉडल पर एक कस्टम प्रबंधक को परिभाषित कर सकते हैं और यह सुनिश्चित करने के लिए use_for_related_fields=True सेट कर सकते हैं ताकि यह स्वचालित प्रबंधक के रूप में उपयोग किया जा सके। controlling automatic Manager types पर प्रलेखन देखें।

+0

आदमी, आप इन भागों के चारों ओर मेरे django गुरु हैं, आप सब कुछ जानते हैं –

+4

यह काम नहीं करता है। एक कस्टम प्रबंधक बनाना जो use_for_related_fields = True सेट करता है यह सुनिश्चित करता है कि संबंधित प्रबंधक का सुपरक्लास कस्टम प्रबंधक है। हालांकि, संबंधित प्रबंधक वर्ग को मेरे प्रश्न में निर्दिष्ट फ़ाइल में गतिशील रूप से परिभाषित किया गया है और कस्टम प्रबंधक में कोई भी add() संबंधित प्रबंधक की गतिशील परिभाषा द्वारा ओवरराइड किया गया है। मैं संबंधित मैनेजर के ऐड() को संशोधित कर सकता हूं और कस्टम प्रबंधक के भीतर self.pre_save() और self.post_save() हुक को लागू करने के लिए जोड़ सकता हूं और फिर Django को पैच सबमिट कर सकता हूं, लेकिन मुझे आश्चर्य है कि कोई बेहतर तरीका है या नहीं के बारे में पता। – brildum

+1

-1 क्योंकि यह काम नहीं करता है, उस चर में '_related_' इतिहास का केवल टुकड़ा है और संबंधित क्षेत्रों के प्रबंधकों के साथ कुछ लेना देना नहीं है। – Evgeny

0

मुझे लगता है कि मुझे एक ही समस्या है।

मेरे पास एक कस्टम मैनेजर है जो विभिन्न डेटाबेस पर रूट करने के लिए self._db और get_query_set() ओवरराइड करता है।

मैंने गतिशील रूप से मॉडल कक्षा बनाई, और इसके कस्टम प्रबंधक के साथ सेट _default_manager है।

यह कक्षा के लिए ही काम करता है, लेकिन संबंधित क्षेत्र (विदेशी या कई 2many) के लिए नहीं, भले ही मैंने सेट use_for_related_fields = True सेट किया हो।

संबंधित क्षेत्र के लिए, जोड़कर db_manager(dbname) (उदाहरण के लिए record.managed_set.db_manager(dbname)) सभी() विधि, लेकिन नहीं जोड़ने के लिए() विधि ठीक कर सकते हैं।

को समझने के लिए मैं क्या मतलब है, यह Django टिकट देखें: http://code.djangoproject.com/ticket/13358

मैं इसे all() लिए काम करता है लगता है, लेकिन नहीं add()

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