使用列值作为键,另一个列值作为dict从django ORM



在Django中,我正在尝试不使用for循环来优化操作的输出

我的模型结构是这样的

class Test(BaseClass):
id = model.UUIDField(uniq=True)
ref = models.ForeignKey(Ref)
name = model.CharField(max_length=50)

表中的样例数据

+--------------------------------------+--------+----------------+
|                  id                  | ref_id |      name      |
+--------------------------------------+--------+----------------+
| 412dacb1-6451-4a1a-b3ac-09a30979b733 |      1 | test           |
| fa7abc8e-2070-40b6-af84-6a8d78676b89 |      2 | new_rule       |
| dd70a968-778c-4e45-9044-599effd243a6 |      3 | new_rule_test |
+--------------------------------------+--------+----------------+

我需要在字典中输出像这样的东西

{
1: {
"name": "test",
"id": UUID(412dacb1-6451-4a1a-b3ac-09a30979b733)
},
2: {
"name": "new_rule",
"id": UUID(fa7abc8e-2070-40b6-af84-6a8d78676b89)
},
3: {
"name": "new_rule_test",
"id": UUID(dd70a968-778c-4e45-9044-599effd243a6)
}
}

在上面的输出中,键是ref_id,值也是一个具有名称和id的字典。

我已经尝试过annotate,但它不工作。只有下面的代码,这是工作,但我需要更多的优化,因为数据是非常庞大的。

res_dict = Test.objects.filter(publisher_state='Published').values('ref', 'name', 'id')
final_dict = {row['ref']: {'name': row['name'], 'id':row['id']} for row in res_dict} 

可能的优化:

from django.db.models import F
queryset = Test.objects.all().values('ref_id', 'name', 'id')
result = queryset.annotate(ref_name=F('ref__name')).values('ref_id', 'name', 'id', 'ref_name')
final_dict = {}
for row in result:
final_dict[row['ref_id']] = {'name': row['name'], 'id': row['id'], 'ref_name': row['ref_name']}

:通过使用这种方法,与原始方法相比,您可以提高代码的效率。这是通过减少需要从数据库中获取的数据量和消除构造最终字典的单独循环来实现的。

最新更新