我需要能够全局替换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>
先谢谢!
答案 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方面需要做更多的工作。这可能是一种更有效的方法,但这就是我现阶段所拥有的一切。