5👍
✅
prefetch_related only works when you use .all()
.
If you apply any other transformations like .filter()
, the new DB query will be made. This is because prefetch_related
simply caches ALL related instances in list, so Django cannot perform filter()
on list. To solve your issue you should use Prefetch object.
You can pass queryset
parametr to it. So, instead of using list_prefetch_related, override get_queryset
method in your admin class.
def get_queryset(*args, **kwargs):
qs = super().get_queryset(*args, **kwargs)
qs = qs.prefetch_related(Prefetch('c2app2_set', queryset=C2App2.objects.filter(is_ok=False)))
return qs
And
class C1App1(WithDateAndOwner):
def get_c2_app2(self):
res = self.c2app2_set.all()
if res.count() > 0:
return res[0]
else:
return None
Source:stackexchange.com