【发布时间】:2021-07-12 07:46:10
【问题描述】:
# My Database Models
ModelA(models.Model):
referancer = models.CharField()
...
ModelXYZ(models.Model):
name = models.CharField()
...
我有像 top 这样的模型,它们之间没有外键关系,结构也应该保持这种方式,因为在我的实际查询中;过滤器和注释比这个更复杂。这也是重现问题的最简单方法。
modelXYZ_subquery = ModelXYZ.objects.filter(name__exact=OuterRef('referancer')).order_by('-id')
modelA_dataset = ModelA.objects.filter(**my_custom_filters).annotate(
has_XYZ=Exists(modelXYZ_subquery),
latest_xyz=Subquery(modelXYZ_subquery.values('id')[:1], output_field=IntegerField)
)
for _modelA in modelA_dataset:
my_custom_function_1(_modelA)
if _modelA.has_XYZ:
detected_xyz = ModelXYZ.objects.get(id=_modelA.latest_xyz) # Database Hit
else:
detected_xyz = create_xyz(_modelA)
my_custom_function_2(_modelA, detected_xyz)
这是我得到的功能,但由于数据集庞大,它的工作时间太长了。
我想摆脱我在 for 循环中获得的不必要的数据库命中。
有没有办法通过 annotation 或 prefetch_related 或其他东西来实现这个目标?
【问题讨论】:
-
为什么
referancer这个字段不是ForeignKey? -
这不是我的选择,数据库结构应该保持这种状态。只是想加快我在下面得到的功能。
标签: mysql django orm prefetch annotate