我需要能够全局替换django结果中的某些数据并对其进行操作。
我已经有一个自定义管理器做排除基于另一个数据库,如CRMData.filtered_obj
工作良好,但我有需要某些东西分组的实例,然后我需要执行新分组的总数/计数,例如我得到一个结果使用annotate(Count(name)) eg:
Pizza 20
Beer 5
Tea 3
Nerds 2
例如,我需要组合Pizza和Beer,所以列表变成:
Beer & Pizza 25
Tea 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'))
当我得到a:
Cannot resolve keyword 'name1' into field
我尝试了一些不同的事情,如将.group_by()
添加到末尾,但我仍然得到相同的错误。
理想情况下,我希望能够使用queryset方法进行交易,因为有很多预先存在的代码围绕它构建,目标是将其添加为先于其他方法的自定义管理器方法,但我不确定这是否可能。
我一直在考虑将结果放入一个熊猫数据框架并使用它,但如果有人有任何建议,如果这是不可能的,我会很感激,尽管这将意味着大量的重写代码。
经过一些研究和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来说需要做更多的工作。可能有更有效的方法但我现在就只有这些了