Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:用数据库字段注释相同的名称_Python_Django_Orm_Annotations - Fatal编程技术网

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

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

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