2014-05-13 19 views
1

我需要能夠全局替換django結果中的某些數據並對其執行操作。替換django結果/覆蓋操作數據

我已經有一個基於另一個數據庫做排除的自定義管理器,例如CRMData.filtered_obj,它可以正常工作,但是我有需要某些事情分組的實例,然後我需要執行新分組的總數/計數,例如我得到一個使用結果註釋(計數(名)),例如:

比薩20 啤酒5 茶3個 書呆子2

再舉例來說,我需要比薩餅和啤酒的結合,從而列表變成: 啤酒&披薩25 茶3 Nerds 2 Banana 1

而且該列表現在必須填充下一個最高數字。

我已經嘗試做這樣的事情:

CRMData.objects.extra(select={'name1': 'case name where "Beer" OR "Pizza" then "Beer & Pizza" else name'}) 

結果且與額外的列輸出,但我無法執行

CRMData.objects.extra(select={'name1': 'case name where "Beer" OR "Pizza" then "Beer & Pizza" else name'}).values('name1').annotate(Count('name1')) 

當我得到一個:

Cannot resolve keyword 'name1' into field 

我已經嘗試了一些不同的東西,比如將.group_by()添加到最後,但我仍然得到相同的錯誤。

理想情況下,我希望能夠使用queryset方法進行事務處理,因爲圍繞它構建了很多預先存在的代碼,目標是將此作爲自定義管理器方法添加到其他方法之前,但我不確定如果這是可能的。

我玩弄了將結果放到熊貓數據框中的想法,並使用它,但如果任何人有任何建議,如果這是不可能的,我會很感激,雖然這將意味着很多重寫代碼。

感謝先進!

回答

0

經過django用戶郵件列表的一些研究和建議後,我被告知django的ORM不支持這樣的功能。

假設我想出的一個解決方案是使用django生成查詢並替換列名稱並運行查詢raw。

a = CRMData.objects.filter(log_type='Request').query 

SELECT `"TABLE_NAME"`.`"Log_Number "`, `"TABLE_NAME"`.`"First_Name"`, 
`"TABLE_NAME"`.`"Incident_Date"`, `"TABLE_NAME"`.`"Item_Description"`, 
`"TABLE_NAME"`.`"Problem_Code"`, `"TABLE_NAME"`.`"Call_type"`, 
`"TABLE_NAME"`.`"Log_Severity"`, `"TABLE_NAME"`.`"Log_Status"`, 
`"TABLE_NAME"`.`"Owner"`, `"TABLE_NAME"`.`"Group"`, `"TABLE_NAME"`.`"Log_Summary"`, 
`"TABLE_NAME"`.`"Created_By"`, `"TABLE_NAME"`.`"USER_NAME"`, 
`"TABLE_NAME"`.`"LAST_UPDATE_DATE"`, `"TABLE_NAME"`.`"LAST_UPDATED_BY"`, 
`"TABLE_NAME"`.`"LAST_UPDATED_BY_USERNAME"` FROM `"TABLE_NAME"` WHERE 
`"TABLE_NAME"`.`"Call_type"` = Request 

這提供了原始查詢,所以現在我們可以用一個例子替換相關的列。

new_query = a.replace('`"TABLE_NAME"`.`"Problem_Code"`', 
'CASE `"TABLE_NAME"`.`"Problem_Code"` 
WHEN "value" then "new value" 
ELSE `"TABLE_NAME"`.`"Problem_Code"` 
END') 

然後,您可以運行

instance = CRM.objects.raw(new_query) 

返回結果。

也可以在Python中對其進行處理,這是可行的,但是在Python方面需要做更多的工作。這可能是一種更有效的方法,但這是我在這個階段所做的。