Nic*_*ick 8 django django-models django-orm
如果我有模型 A 和模型 B 的外键,如何使用模型 B 中的某些条件从模型 B 预取模型 A?
这是我想要的(OuterRef 显然只适用于子查询,但这基本上是我需要的功能):
class ModelA(models.Model):
somecriteria = models.CharField()
class ModelB(models.Model):
somerelation = models.ForeignKey(ModelA)
someattribute = models.CharField()
qs = ModelA.objects.all()
qs = qs.prefetch_related(
Prefetch(
'modelb_set',
queryset=ModelB.objects.filter(someattribute=OuterRef('somecriteria')),
to_attr='some_attr'
),
)
Run Code Online (Sandbox Code Playgroud)
该查询应该执行以下操作(在较少的查询中):
for obj in qs:
# Change this to new_qs = obj.some_attr if prefetch is working.
newqs = obj.modelb_set.filter(someattribute=obj.somecriteria)
if newqs.exists():
# Do something
Run Code Online (Sandbox Code Playgroud)
modelb_qs = models.Subquery(
ModelB.objects.filter(
someattribute=models.OuterRef("somerelation__somecriteria")
).values("id")
)
qs = ModelA.objects.prefetch_related(
models.Prefetch("modelb_set", queryset=ModelB.objects.filter(id__in=modelb_qs))
)
for obj in qs:
if len(obj.modelb_set.all()):
# Do something
Run Code Online (Sandbox Code Playgroud)
这只会进行 2 个查询,如果你在循环中添加一个 filter() ,你将进行 N(O^2) 次查询......不好。
我写了一个测试来证明这只会进行 2 个查询,你可以在这里找到它:
https://gist.github.com/kingbuzzman/fd2b635f2cf011f1330a6be088ce3664#file-modelabquery-py-L125
归档时间: |
|
查看次数: |
1386 次 |
最近记录: |