【发布时间】:2021-11-24 19:36:56
【问题描述】:
如何优化以下请求以消除循环?代码数是几百,所以我得到了几百个数据库查询,这是不可接受的。
n = 3
result = []
codes = Target.objects.filter(code__in=['ABC', 'CDE', ...])
for code in codes:
result.append(Data.objects.select_related('target')
.filter(target__code=code)
.values('spec', 'spec_type')
.order_by('-spec')[:n])
型号:
class Data(models.Model):
target = models.ForeignKey(Target)
spec_type = models.CharField()
spec = models.FloatField()
class Target(models.Model):
code = models.TextField(db_index=True)
【问题讨论】:
-
应该是什么结果:当前您正在构建
QuerySets 的列表。你想要一个“平面”的项目列表吗?对于Querysets的列表,可以做的优化不多。 -
我删除了一些将Querysets转换为dicts的逻辑,最终结果如下: [ {'ABC': [{'spec': 'Spec 123', 'spec_type': '规格类型 A'},{'spec':'规格 456','spec_type':'规格类型 B'}]},'CDE':...]。所以它是带有键“代码”和值的字典 - 两个字典的列表,它们是数据,由 Data.objects.... 查询检索。
标签: django optimization orm