Python Django:使用数据库字段注释相同的名称

时间:2018-01-10 16:04:38

标签: 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')
很明显,这个解决方案没有很好的表现。如何摆脱

  

"注释' id'与模型中的字段冲突"

丢弃之前的'id'并注释新的'id'

异常

1 个答案:

答案 0 :(得分:2)

  

“必须命名为'id'的东西”

为什么呢?

无论如何,除此之外,您是否曾尝试在致电values之前将呼叫转移至annotate

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