替换django results/毛毯操作数据



我需要能够全局替换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来说需要做更多的工作。可能有更有效的方法但我现在就只有这些了

相关内容

  • 没有找到相关文章

最新更新