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(),
    )
)
Вернуться на верх