替换django结果/毯子操纵数据

时间:2014-05-13 04:14:28

标签: python django replace django-queryset

我需要能够全局替换django结果中的某些数据并对其执行操作。

我已经有一个自定义管理器根据另一个数据库进行排除,例如CRMData.filtered_obj工作正常但是我有实例需要对某些事物进行分组,然后我需要执行新分组的总计/计数,例如我得到一个结果使用注释(Count(name))例如:

披萨20 啤酒5 茶3 书呆子2

例如,我需要将Pizza和Beer结合起来,所以列表变为: 啤酒&比萨饼25 茶3 书呆子2 香蕉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方法进行交易,因为围绕它构建了许多预先存在的代码,目标是将其添加为优先于其他方法的自定义管理器方法,但我不确定是否这是可能的。

我已经玩弄了将结果放入熊猫数据框并使用它的想法,但如果有人有任何建议,如果这是不可能的,我将不胜感激,虽然这将意味着大量的代码重写。 / p>

先谢谢!

1 个答案:

答案 0 :(得分:0)

经过django用户邮件列表的一些研究和建议后,我被告知django的ORM不支持这样的功能。

我想出的解决方案是使用django生成查询并替换列名并运行查询原始,例如。

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方面需要做更多的工作。这可能是一种更有效的方法,但这就是我现阶段所拥有的一切。