Django комментирует несколько объектов на основе нескольких полей в отношении M2M - PullRequest
4 голосов
/ 12 июля 2019

Я хочу эффективно аннотировать объекты модели A на основе некоторых полей в модели B, которая имеет простое отношение «многие ко многим» (без использования сквозной модели), к A.Складка в том, что я должен найти самую старую B для каждого A (используя B.created_timestamp), но затем заполнить, используя B.name.Я хочу использовать ORM, а не чистый SQL.

Я пробовал это, но это не правильно:

a_qs = A.objects.filter(id__in=ids)
ordered_qs = a_qs.order_by('-b__created_timestamp')
oldest_qs = Subquery(ordered_qs.values('b__name')[:1])
result = list(a_qs.annotate(name=oldest_qs))

Это аннотирует каждый A с тем же самым старым именем B во всехB s относится к A, но я хочу самый старый B среди связанных B s для каждого A.

1 Ответ

0 голосов
/ 29 июля 2019

Вы забыли установить OuterRef https://docs.djangoproject.com/en/2.2/ref/models/expressions/

b_qs = B.objects.filter(a=OuterRef('pk')).order_by('-created_timestamp')
a_qs = A.objects.filter(id__in=ids).annotate(oldest_name=Subquery(b_qs.values('name')[:1])
result = list(a_qs)
...