2016-03-02 8 views
7

मेरे पास कम से कम मेरे लिए कुछ अजीब व्यवहार है, जो मुझे मेरे प्रोजेक्ट में कुछ बग पैदा कर रहा है।क्यों Django की संबंधित_मोडेल संपत्ति मॉडल उदाहरण के बजाय स्ट्रिंग लौट रही है?

मैं Django 1.9 और एक तीसरी पार्टी Django पैकेज (django-jet) कि Django व्यवस्थापक में field.related_model संपत्ति का उपयोग करता है और कभी कभी यह विफल रहता है, क्योंकि यह field.related_model रिटर्न एक मॉडल उदाहरण अपेक्षा करता है और अपने मॉडल से कुछ के लिए मॉडल का नाम लौटा रहा है उपयोग कर रहा हूँ ।

This is the property defined in Django code:

@cached_property 
def related_model(self): 
    # Can't cache this property until all the models are loaded. 
    apps.check_models_ready() 
    return self.remote_field.model 

चीज़ें है कि मैंने कोशिश की:

  • तो Django के related_model एक @property बजाय एक @cached_property यह काम करता है और मॉडल उदाहरण देता है।
  • यदि मैं field.related_model की बजाय field.remote_field.model पर कॉल करता हूं, जो कि बग का कारण बनता है और मॉडल उदाहरण देता है।

कृपया, क्या आपको कोई विचार है? मैं कामकाज कर सकता हूं लेकिन मैं जानना चाहता हूं कि यह व्यवहार क्यों है।

अग्रिम धन्यवाद!

उत्तर

2

मुझे लगता है कि यहां समस्या उत्पन्न होती है क्योंकि जेट related_modelRelatedFieldAjaxListFilter.field_choices() विधि में उपयोग करने का प्रयास कर रहा है, और यह सभी ऐप्स लोड होने से पहले निष्पादित किया जा सकता है। अगर मैं सही ढंग से समझता हूं, तो related_model मान प्रारंभ में एक स्ट्रिंग है, जिसे मॉडल प्रारंभिकरण के दौरान मॉडल ऑब्जेक्ट के साथ प्रतिस्थापित किया जाता है। यदि आप ऐप्स को लोड होने से पहले उस मान को प्राप्त करने का प्रयास करते हैं, तो मॉडल को लोड किए जाने वाले क्रम के आधार पर, आप या तो स्ट्रिंग या ऑब्जेक्ट प्राप्त कर सकते हैं। और, चूंकि यह एक कैश की गई संपत्ति है, इसलिए उस चरण में एक स्ट्रिंग मान प्राप्त करने से स्ट्रिंग मान को कैश किया जा सकता है। उदाहरण के लिए, देखो, django.db.models.options में टिप्पणी,

# The mechanism for getting at the related model is slightly odd - 
# ideally, we'd just ask for field.related_model. However, related_model 
# is a cached property, and all the models haven't been loaded yet, so 
# we need to make sure we don't cache a string reference. 

related_name एक uncached संपत्ति बनाने करके, आप उस समस्या से बचने के।

django.contrib.admin.filters.RelatedFieldListFilter कोड में, वे related_model उपयोग नहीं करते मॉडल वस्तु प्राप्त करने के लिए, लेकिन बजाय एक उपयोगिता समारोह, django.contrib.admin.utils.get_model_from_relation() का उपयोग करें। RelatedFieldAjaxListFilter.field_choices() शायद कुछ ऐसा ही करना चाहिए।

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