Python Django:用数据库字段注释同名

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'?

PyP*_*ngu 5

“必须命名为‘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)