Django orm: использование случая аннотации в результатах предварительной выборки
это почти точная копия моих моделей:
class To(models.Model):
pass
class FromA(models.Model):
to = models.ForeignKey(To)
class FromB(models.Model):
to = models.ForeignKey(To)
есть ли способ написать такой запрос?
To.objects.annotate(from=Case(
When(froma__isnull=False, then=Prefetch("froma")),
When(fromb__isnull=False, then=Prefetch("fromb"))
))
пока это лучший ответ, который я нашел.
from django.db.models import Subquery, OuterRef
froma_info = FromA.objects.filter(To=OuterRef('pk')).values('carrot', 'pear', 'apple')[:1]
fromb_info = FromB.objects.filter(To=OuterRef('pk')).values('carrot', 'pear', 'apple')[:1]
to_list = To.objects.annotate(
from=Case(
When(froma__isnull=False, then=Subquery(froma_info)),
When(fromb__isnull=False, then=Subquery(fromb_info)),
default=Value({
'carrot': 'No from available',
'pear': '',
'apple': '',
}),
output_field=JSONField(),
)
)