2011-08-31 73 views
1

有一點背景:我正在嘗試構建一個強大的動態查詢集表單,以允許半功率用戶(市場營銷人員?)深入訪問分析數據。給定QS字段查找鍵,如何在連接中查找字段類型?

我已經建立了一個功能,提供現場查找鍵,例如,給定一個型號,如:

class Profile(models.Model): 
    user = models.OneToOneField("auth.User") 
    age = models.PositiveIntegerField() 

我有一個返回遞歸函數:

[ 
    'id', 
    'user', 
    'user__id', 
    'user__username', 
    'user__first_name', 
    #...snip... 
    'user__is_active', 
    'user__date_joined', 
    #...snip... 
    'user__groups__permissions', 
    'user__groups__permissions__id', 
    'user__groups__permissions__name', 
    #...snip... 
    'age', 
] 

我」什麼在用戶選擇他們選擇的鍵之後,顯示&解釋類似於ModelForm將做的相應標準表單字段(小部件),但是我首先需要該字段的類型。

那麼我將如何去餵養一個功能類似的東西「年齡」,「user__date_joined」和「用戶_ _permissions__name」並取回PositiveIntegerField,的DateField和CharField(分別?)。

我假設Django必須在ORM中這樣做,所以我確信功能被烘焙成Django 某處,我只是沒有找到它。

回答

2

你想要的信息是在類的元屬性:

Profile._meta.get_field_by_name('field_name') 

這將返回:

(field_object, model, direct, m2m) 

model填充,如果你從一個模型對象得到這個,而不是直接從如果該字段在模型中存在(而不是由於ORM的查找而生成),則該類對象direct爲真,如果該字段是多對多關係的一部分,則該對象爲真。

[EDIT對於 '__' 的關係]

在Django的源代碼(分貝/模型/ SQL/query.py),它們拆開用下面的代碼字段類型。我不能給它說話,但看上去語義正確:

parts = field_name.split('__') 
cur_model = model 
for name in parts: 
    (field, _, _, _) = cur_model._meta.get_field_by_name(name) 
    cur_model = field.rel.to 

這基本上說,對於外鍵關係領域只包含ID和rel.to就是Django使用實際得到的模型,該字段引用,並且此循環通過字段列表下降,直到找到字符串中的最後一個。

+0

這當然適用於直接在模型上的任何字段,但是,如果使用任何分隔符(如'__'),則失敗。 – Bryan

+0

@Bryan:我已經添加了一個簡單的例子,使用從Django自己的內部代碼派生的循環,演示瞭如何爲ForeignKey關係執行此操作。 –

+0

謝謝!我會嘗試看看是否有幫助。 – Bryan