Python Django:用数据库字段注释相同的名称
我需要注释一些必须命名为“id”的东西,它与表“id”的主键相同。最终输出应该是一个字典数组。我知道我可以用另一个名字来注释,比如'id_for_tree',然后在使用值生成字典并更改循环中的键之后。比如:Python Django:用数据库字段注释相同的名称,python,django,orm,annotations,Python,Django,Orm,Annotations,我需要注释一些必须命名为“id”的东西,它与表“id”的主键相同。最终输出应该是一个字典数组。我知道我可以用另一个名字来注释,比如'id_for_tree',然后在使用值生成字典并更改循环中的键之后。比如: item_list = MyTable.objects.annotate(id_for_tree=Concat(F('id'), F('Code'), output_field=CharField())).values('Name', 'id_for_tree') for any_item
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”而导致异常 必须命名为“id”的内容 为什么? 不管怎样,撇开这一点不谈,您是否尝试过将对值的调用移到对注释的调用之前 i、 e 这是基于名称字段也是唯一的 编辑:如果名称字段不是唯一的,则可以通过额外调用值和注释来完成。 i、 e 编辑自问题所有者:最后,我使用此代码通过以下方式避免无意中将_分组:
item_list = MyTable.objects.annotate(
OriginalId=F('id')
).values(
'Name',
'OriginalId'
).annotate(
id=Concat(F('id'), F('Code'), output_field=CharField()
))
必须命名为“id”的内容
为什么?
不管怎样,撇开这一点不谈,您是否尝试过将对值的调用移到对注释的调用之前
i、 e
这是基于名称字段也是唯一的
编辑:如果名称字段不是唯一的,则可以通过额外调用值和注释来完成。
i、 e
编辑自问题所有者:最后,我使用此代码通过以下方式避免无意中将_分组:
item_list = MyTable.objects.annotate(
OriginalId=F('id')
).values(
'Name',
'OriginalId'
).annotate(
id=Concat(F('id'), F('Code'), output_field=CharField()
))
很明显,这个解决方案没有很好的性能->您分析过吗?与DB调用相比,Python中类似的简单for循环不太可能有显著的开销。注意,循环将评估queryset,但您可能最近会这样做。另外,如果您不想执行循环,那么您可以随时使用id_for_tree,而不是id,无论您在哪里需要它!很明显,这个解决方案没有很好的性能->您分析过吗?与DB调用相比,Python中类似的简单for循环不太可能有显著的开销。注意,循环将评估queryset,但您可能最近会这样做。另外,如果您不想执行循环,那么您可以随时使用id_for_tree,而不是id,无论您在哪里需要它!因为web服务的结果将被一个库ngJsTree使用。但是如果我不能保证名称是唯一的呢?您的编辑只是减少了代码量吗?还是说我的第二个解决方案导致了无意的分组?我不希望出现任何意外的分组,因为id_dummy包含原始的唯一id字段,因此也应该是unique@PerlPingo您的第二个解决方案似乎运行良好,但我尚未对其进行测试。我使用了替代代码使其更简单。因为web服务的结果将由库ngJsTree使用。但是如果我不能保证名称是唯一的,该怎么办?您的编辑只是减少了代码量吗?还是说我的第二个解决方案导致了无意的分组?我不希望出现任何意外的分组,因为id_dummy包含原始的唯一id字段,因此也应该是unique@PerlPingo您的第二个解决方案似乎运行良好,但我尚未对其进行测试。我使用了另一种代码来简化它。
item_list = MyTable.objects.annotate(
OriginalId=F('id')
).values(
'Name',
'OriginalId'
).annotate(
id=Concat(F('id'), F('Code'), output_field=CharField()
))