我需要注释一些必须命名的内容' 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')
很明显,这个解决方案没有很好的表现。如何摆脱
丢弃之前的"注释' id'与模型中的字段冲突"
'id'
并注释新的'id'
异常
答案 0 :(得分:2)
“必须命名为'id'的东西”
为什么呢?
无论如何,除此之外,您是否曾尝试在致电values
之前将呼叫转移至annotate
?
即
item_list = MyTable.objects.values('Name').annotate(id=Concat(F('id'), F('Code'), output_field=CharField()))
这取决于Name
字段也是唯一的。
编辑:如果Name
字段不是唯一的,那么您可以通过额外调用values
和annotate
来执行此操作。
即。
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')
)
来自问题所有者的编辑:最后,我使用此代码来避免无意中group_by:
item_list = MyTable.objects.annotate(
OriginalId=F('id')
).values(
'Name',
'OriginalId'
).annotate(
id=Concat(F('id'), F('Code'), output_field=CharField()
))