2010-01-14 12 views
43

कहें my_instance मॉडल MyModel का मॉडल है।
मुझे क्या करना एक अच्छा तरीका के लिए देख रहा हूँ:django: उस मॉडल के उदाहरण से मॉडल प्राप्त करने का सबसे अच्छा तरीका

my_model = get_model_for_instance(my_instance) 

मैं यह करने के लिए किसी भी वास्तव में सीधा रास्ता नहीं मिला है।

from django.db.models import get_model 

my_model = get_model(my_instance._meta.app_label, my_instance.__class__.__name__) 

इस स्वीकार्य है: अब तक मैं इस के साथ आए हैं? क्या यह भी एक निश्चित आग है, इसे करने का सबसे अच्छा तरीका है?
_meta.object_name भी है जो __class__.__name__ जैसा ही प्रतीत होता है। क्या यह? बेहतर या बदतर है? यदि हां, तो क्यों?

साथ ही, मुझे कैसे पता चलेगा कि अगर मैं परियोजना के दायरे में ऐप लेबल कई बार होता हूं तो मुझे सही मॉडल मिल रहा है, उदा। 'duthango.contrib.auth' से 'auth' और 'myproject.auth' भी होने दें?
क्या ऐसा कोई मामला get_model अविश्वसनीय करेगा?

किसी भी संकेत/पॉइंटर्स और अनुभव साझा करने के लिए धन्यवाद!

+3

'__class__' बिल्कुल ** ** उदाहरण के लिए कक्षा होना चाहिए। कोई संभावित अस्पष्टता नहीं है। पाइथन काम करता है। आप क्या पूछ रहे हो? –

+0

ठीक है, मेरे पास समझने की कुछ सीमाएं हैं। मेरे लिए, अस्पष्टता यह है कि विभिन्न मॉड्यूल में रहने वाले एक से अधिक ऐप लेबल/कक्षा नाम संयोजन हो सकते हैं। हालांकि, get_model को इनपुट के रूप में मॉड्यूल प्राप्त नहीं होता है। तो यह कौन सा मॉडल वितरित करेगा? दूसरी बात यह है कि मुझे समझ में नहीं आता कि ऑब्जेक्ट_नाम किस लिए अच्छा है, क्योंकि यह '__class __.__ name__' के समान स्ट्रिंग देता है, और कितने लोग' get_model' या अन्य जगहों में उपयोग के लिए इनमें से कौन सा चुनते हैं। धन्यवाद! – Geradeausanwalt

उत्तर

69
my_model = type(my_instance) 

यह साबित करने के लिए आपको एक और उदाहरण बना सकते हैं:

my_new_instance = type(my_instance)() 

यही कारण है कि वहाँ यह करने का कोई सीधा रास्ता है, क्योंकि अजगर वस्तुओं पहले से ही यह सुविधा।

अद्यतन ...

मैं marcinn's responsetype(x) का उपयोग करता है पसंद आया। यह मूल उत्तर का उपयोग करने के समान है (x.__class__), लेकिन मैं जादू attribtues तक पहुंचने पर कार्यों का उपयोग करना पसंद करते हैं। इस तरह, मैं vars(x) से x.__dict__, len(x) से x.__len__ और इसी तरह का उपयोग करना पसंद करता हूं।

अद्यतन 2 ...

टाल उदाहरणों (टिप्पणी में @Cerin ने उल्लेख किया) के लिए आप instance._meta.proxy_for_model के माध्यम से मूल वर्ग पहुँच सकते हैं।

+2

यह केवल '() 'का उपयोग करके प्रश्नों से स्थगित उदाहरणों या उदाहरणों के साथ काम नहीं करता है। – Cerin

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