डीजेंगो मॉडल कक्षाओं के निर्माण को अनुकूलित करने के लिए metaclass (django.db.models.base.ModelBase
) का उपयोग करता है। मॉडल पर एक वर्ग विशेषता के रूप में परिभाषित प्रत्येक ऑब्जेक्ट के लिए (user
वह है जिसे हम यहां परवाह करते हैं), Django पहले यह देखने के लिए देखता है कि यह contribute_to_class
विधि को परिभाषित करता है या नहीं। यदि विधि परिभाषित की जाती है, तो Django इसे कॉल करता है, जिससे ऑब्जेक्ट को मॉडल क्लास को अनुकूलित करने की इजाजत मिलती है। यदि ऑब्जेक्ट contribute_to_class
को परिभाषित नहीं करता है, तो इसे setattr
का उपयोग करके कक्षा में असाइन किया जाता है।
चूंकि ForeignKey
एक Django मॉडल फ़ील्ड है, यह contribute_to_class
को परिभाषित करता है। जब ModelBase
मेटाक्लास कॉल ForeignKey.contribute_to_class
पर कॉल करता है, तो ModelClass.user
पर निर्दिष्ट मान django.db.models.fields.related.ReverseSingleRelatedObjectDescriptor
का उदाहरण है।
ReverseSingleRelatedObjectDescriptor
एक ऐसा ऑब्जेक्ट है जो क्लाइथन के descriptor protocol को लागू करता है ताकि क्लास का एक उदाहरण किसी अन्य वर्ग की विशेषता के रूप में उपयोग किया जा सके। इस मामले में, वर्णनकर्ता का उपयोग lazily load पर किया जाता है और डेटाबेस से संबंधित मॉडल उदाहरण को पहली बार एक्सेस किया जाता है।
# make a user and an instance of our model
>>> user = User(username="example")
>>> my_instance = MyModel(user=user)
# user is a ReverseSingleRelatedObjectDescriptor
>>> MyModel.user
<django.db.models.fields.related.ReverseSingleRelatedObjectDescriptor object>
# user hasn't been loaded, yet
>>> my_instance._user_cache
AttributeError: 'MyModel' object has no attribute '_user_cache'
# ReverseSingleRelatedObjectDescriptor.__get__ loads the user
>>> my_instance.user
<User: example>
# now the user is cached and won't be looked up again
>>> my_instance._user_cache
<User: example>
ReverseSingleRelatedObjectDescriptor.__get__
विधि हर बार user
विशेषता मॉडल उदाहरण पर पहुँचा जा सकता है कहा जाता है, लेकिन यह करने के लिए पर्याप्त स्मार्ट है केवल एक बार संबंधित वस्तु को देखने के लिए और फिर बाद में कॉल पर संचित संस्करण वापस जाएँ।
+1। मुझे स्पष्टीकरण पसंद है। –
धन्यवाद, यह वही है जो मैं सीखना चाहता था। – boatcoder
कैश को संबंधित ऑब्जेक्ट को मजबूर करने का कोई आसान तरीका है? मैं gojogled django.db.models.fields.related.ReverseSingleRelatedObjectDescriptor और इस पोस्ट को मिला ... – yegle