2011-03-20 25 views
7

मैं एक मॉडल ऑब्जेक्ट को एक शब्दकोश में परिवर्तित करने के लिए एक फ़ंक्शन कर रहा हूं (और सभी foreignkeys अधिक शब्दकोशों में, पुनरावर्ती रूप से)। मैंने एक दोस्त से सीखा कि मैं obj._meta.fields देख कर मॉडल के फ़ील्ड प्राप्त कर सकता हूं, लेकिन मुझे इसके लिए कहीं भी दस्तावेज नहीं मिल रहा है।ऑब्जेक्ट के फ़ील्ड कैसे प्राप्त करें?

मैं मॉडल के फ़ील्ड कैसे प्राप्त करूं? _meta कक्षा में कोई भी मुझे कैसे समझा सकता है?

उत्तर

9

यह काफी दिलचस्प लग रहा था, इसलिए मैं django.forms स्रोत के माध्यम से देख रहा था, विशेष रूप से मॉडलफॉर्म कार्यान्वयन के लिए देख रहा था। मुझे लगा कि एक मॉडलफॉर्म किसी दिए गए उदाहरण की आत्मनिरीक्षण में काफी अच्छा होगा, और ऐसा ही होता है कि एक आसान काम उपलब्ध है जो आपके रास्ते पर आपकी मदद कर सकता है।

>>> from django.forms.models import model_to_dict 
>>> from django.contrib.auth.models import Group 
>>> g = Group.objects.filter()[0] 
>>> d = model_to_dict(g) 
>>> d 
{'permissions': [40, 41, 42, 46, 47, 48, 50, 43, 44, 45, 31, 32, 33, 34, 35, 36, 37, 38, 39], 'id': 1, 'name': u'Managers'} 
>>> 

जाहिर है, _meta विशेषता undocumented क्योंकि यह एक आंतरिक कार्यान्वयन विस्तार है। मैं इसे जल्द ही किसी भी समय बदल नहीं देख सकता, इसलिए यह शायद उपयोग करने के लिए अपेक्षाकृत सुरक्षित है। आप जो करना चाहते हैं उसे करने के लिए आप स्टार्टर के रूप में ऊपर model_to_dict फ़ंक्शन का उपयोग कर सकते हैं। कोई बदलाव नहीं होना चाहिए। यदि आप मॉडलों सहित रिकर्सिवली पर योजना बनाते हैं तो रिवर्स रिलेशनशिप से सावधान रहें।

एक अन्य एवेन्यू भी हो सकता है जिसे आप जांचना चाहते हैं। django-piston एक विश्वसनीय ढांचा है जो कई emitters घोषित करता है जो आपके लिए उपयोगी हो सकता है, खासकर BaseEmitter.construct() विधि। आपको DictionaryEmitter को आसानी से परिभाषित करने में सक्षम होना चाहिए जिसे आप रीस्टफुल सीरियलाइज़ेशन के अलावा अन्य उद्देश्यों के लिए उपयोग करते हैं।

+0

ओह अच्छा, 'model_to_dict सबसे बड़े कारणों 'मूल रूप से क्या मेरी समारोह कर रहा था है (मैं इसे calld' objectToDict' .. बीमार सिर्फ इतना है कि कोशिश संपादित करें:।। आह, यह foreignekys है, जो मैं मेरा क्या करना चाहते हैं का पालन नहीं करता मैं लगता है कि मुझे लगता है कि फोन और देख सकते हैं अपने खेतों, लेकिन मैं पहले से ही यह 'साथ _meta' क्षेत्रों तो मैं dnno टिप के लिए पकड़ने चक्र पर लिखा था। धन्यवाद, मैं अपने समारोह से यह ठीक हो (यदि वह पहले एक वस्तु यह सिर्फ उसके परिणाम का उपयोग करता देखा बनाया यथा-स्थान के बजाय आवर्ती) – Claudiu

+0

नहीं, यह FKS का पालन नहीं करता, लेकिन आप एक एक model_to_dict रिकर्सिवली। के बाद से आप पहले से ही मिल गया यह काम कर रहा गया है, कोई चिंता नहीं। जैसा कि मैंने उल्लेख किया है, model_to_dict एक स्टार्टर के रूप में इस्तेमाल किया जा सकता के साथ foreign_key_id प्रत्येक पर की जगह कर सकते हैं, और तदनुसार अनुकूलित। –

4

There's some docs on it, लेकिन ज्यादातर हम Django कार्यों कि आंतरिक रूप से उपयोग किया जाता है, _meta.fields या _meta.get_all_field_names(), _meta.get_field_by_name तरह के लिए उपयोग करता है खोजने के लिए करते हैं।

मेरे लिए, इन्हें iPython और टैब पूर्णता के माध्यम से सबसे अच्छी तरह से खोजा जाता है। या स्रोत।

+1

+1 - इस के लिए दस्तावेज़ (और अन्य वस्तु के तरीकों में से एक गुच्छा) काफी कमी है। डीआईआर फ़ंक्शन मेरे सबसे अच्छे दोस्त रहे हैं, जहां तक ​​इस तरह की चीजें इसका उपयोग करते रहें। के बाद से मैं Django में कोडिंग – hellsgate

+1

हाँ 'dir',' help', और इंटरैक्टिव cmd लाइन की Trifecta शुरू कर दिया मैं यह सबसे अच्छा सीखने उपकरणों में से एक मिल गया है कर रहे हैं कुछ ओ मैं अजगर की तरह – Claudiu

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