gpt4 book ai didi

python Django : Annotating a same name with a database field

转载 作者:行者123 更新时间:2023-12-02 17:12:50 25 4
gpt4 key购买 nike

我需要注释一些必须命名为“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')

很明显,这个解决方案没有很好的性能。我怎样才能摆脱

"The annotation 'id' conflicts with a field on the model"

丢弃之前的'id'并注释一个新的'id'的异常?

最佳答案

"something that has to be named 'id'"

为什么?

无论如何,除此之外,您是否尝试过在调用 annotate 之前简单地将调用移动到 values

item_list = MyTable.objects.values('Name').annotate(id=Concat(F('id'), F('Code'), output_field=CharField()))

这是基于 Name 字段也是唯一的。

编辑:如果 Name 字段不是唯一的,那么您可以通过额外调用 valuesannotate 来完成。即

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()
))

关于 python Django : Annotating a same name with a database field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48191484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com