我正在做一個函數來將模型對象轉換成字典(並且遞歸地將所有foreignkeys
轉換成更多字典)。我從一位朋友那裏瞭解到,我可以通過查看obj._meta.fields
來獲得模型的字段,但是我找不到任何地方的文檔。如何獲取對象的字段?
如何獲取模型的字段?我怎樣才能解釋在_meta
課堂中可以找到什麼?
我正在做一個函數來將模型對象轉換成字典(並且遞歸地將所有foreignkeys
轉換成更多字典)。我從一位朋友那裏瞭解到,我可以通過查看obj._meta.fields
來獲得模型的字段,但是我找不到任何地方的文檔。如何獲取對象的字段?
如何獲取模型的字段?我怎樣才能解釋在_meta
課堂中可以找到什麼?
這似乎相當有趣,所以我仔細查看了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
。
There's some docs on it,但大多我們傾向於找到內部使用的django函數的用法,如_meta.fields
或_meta.get_all_field_names()
,_meta.get_field_by_name
。
對我而言,這些最好通過iPython和Tab完成發現。或者來源。
哦,很好,'model_to_dict '基本上就是我的func在做什麼(我把它叫做'objectToDict' ..虐待只是試試。編輯:啊,它不遵循foreignekys,我想我的。我想我可以打電話,看看它字段,但我已經寫了'_meta'字段,所以我不知道。謝謝你在捕捉週期的提示,我讓我的func處理這件事(如果它已經看到了一個對象,它只是使用它的結果,而不是反覆出現) – Claudiu 2011-03-20 22:05:12
不,它不遵循FKs,但是你可以遞歸地用model_to_dict替換每個foreign_key_id,因爲你已經可以工作了,不用擔心,就像我之前提到的那樣,model_to_dict可以用作啓動器,並相應地調整。 – 2011-03-20 23:24:30