2011-03-20 112 views
7

我正在做一個函數來將模型對象轉換成字典(並且遞歸地將所有foreignkeys轉換成更多字典)。我從一位朋友那裏瞭解到,我可以通過查看obj._meta.fields來獲得模型的字段,但是我找不到任何地方的文檔。如何獲取對象的字段?

如何獲取模型的字段?我怎樣才能解釋在_meta課堂中可以找到什麼?

回答

9

這似乎相當有趣,所以我仔細查看了django.forms源代碼,專門查找了ModelForm實現。我認爲ModelForm在反思一個給定的實例時會相當好,而且恰巧有一個方便的函數可以幫助你。

>>> 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屬性是未記錄,因爲它是內部實現細節。雖然我很快就看不到它會改變,所以使用它可能相對安全。您可以使用上面的model_to_dict函數作爲開始做你想做的事情。不應該有太多的改變。如果您計劃遞歸包含模型,請注意反向關係。

您可能還有其他途徑想調查。 django-piston是一個RESTful框架,用於聲明可能對您有用的幾個emitters,特別是BaseEmitter.construct()方法。您應該能夠很容易地定義您用於RESTful序列化之外的目的的DictionaryEmitter

+0

哦,很好,'model_to_dict '基本上就是我的func在做什麼(我把它叫做'objectToDict' ..虐待只是試試。編輯:啊,它不遵循foreignekys,我想我的。我想我可以打電話,看看它字段,但我已經寫了'_meta'字段,所以我不知道。謝謝你在捕捉週期的提示,我讓我的func處理這件事(如果它已經看到了一個對象,它只是使用它的結果,而不是反覆出現) – Claudiu 2011-03-20 22:05:12

+0

不,它不遵循FKs,但是你可以遞歸地用model_to_dict替換每個foreign_key_id,因爲你已經可以工作了,不用擔心,就像我之前提到的那樣,model_to_dict可以用作啓動器,並相應地調整。 – 2011-03-20 23:24:30

4

There's some docs on it,但大多我們傾向於找到內部使用的django函數的用法,如_meta.fields_meta.get_all_field_names()_meta.get_field_by_name

對我而言,這些最好通過iPython和Tab完成發現。或者來源。

+1

+1 - 這個(和一堆其他對象方法)的文檔是相當缺乏。 dir函數一直是我最好的朋友,所以繼續使用它。自從我開始在Django編碼之後,我發現它是最好的學習工具之一 – hellsgate 2011-03-20 21:41:17

+1

是'dir','help'和交互式cmd行的三連詞是我喜歡Python的最大理由 – Claudiu 2011-03-20 21:56:37

相關問題