Ahm*_*mad 1 python django orm annotations
我需要注释一些必须命名为“id”的东西,它与表“id”的主键相同。最终输出应该是一个字典数组。我知道我可以使用另一个名称(如“id_for_tree”)进行注释,然后在使用之后values()制作字典并在循环中更改键。就像是:
item_list = MyTable.objects.annotate(id_for_tree=Concat(F('id'), F('Code'), output_field=CharField())).values('Name', 'id_for_tree')
for any_item in item_list:
any_item['id'] = any_item.pop('id_for_tree')
Run Code Online (Sandbox Code Playgroud)
很明显,这个解决方案没有很好的性能。我怎样才能摆脱
“注释‘id’与模型上的字段冲突”
通过丢弃以前的异常'id'并注释新的'id'?
“必须命名为‘id’的东西”
为什么?
无论如何,除此之外,您是否尝试过简单地将呼叫移动到呼叫values之前annotate?
IE
item_list = MyTable.objects.values('Name').annotate(id=Concat(F('id'), F('Code'), output_field=CharField()))
Run Code Online (Sandbox Code Playgroud)
这是基于该Name领域也是独一无二的。
编辑:如果该Name字段不是唯一的,那么您可以通过额外调用valuesand 来完成annotate。IE
item_list = MyTable.objects.values(
'Name', 'id'
).annotate(
id_dummy=Concat(F('id'), F('Code'), output_field=CharField())
).values(
'id_dummy',
'Name'
).annotate(
id=F('id_dummy')
)
Run Code Online (Sandbox Code Playgroud)
来自问题所有者的编辑:最后,我使用此代码来避免无意中 group_by:
item_list = MyTable.objects.annotate(
OriginalId=F('id')
).values(
'Name',
'OriginalId'
).annotate(
id=Concat(F('id'), F('Code'), output_field=CharField()
))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3165 次 |
| 最近记录: |