Показать два разных столбца в аннотации Django

У меня возникают проблемы с аннотацией в Django.

У меня есть две модели в проектах. (только структура)

model A (field:name(char))
model B (field:A(A; related_name="b"), user(user), content(char; null=True))

Данные model B такие же, как...

row1 -> A:1, user:2, content:"content1"
row2 -> A:1, user:3, content:"content2"
row3 -> A:1, user:2, content:None
row4 -> A:2, user:1, content:None
row5 -> A:1, user:3, content:None

Мое намерение - это уникальное значение, которое объединяет пользователя и контент в соответствии с пк искомого model A.

Если я ищу пк:1 из Model A, а ответ, который мне нужен, равен 2, то причина в следующем.

row1 -> A:1, user:2
row2 -> A:1, user:3

Итак, оригинальный код был...

subquery = B.objects.filter(a=pk).distinct('user').count()
A.objects.annotate(count=Value(subquery)).get(pk=pk)

Однако это неэффективно, поскольку приводит к созданию еще одного запроса, а не внутреннего соединения.

Что мне делать?

Вместо этого вы можете переместить фокус на модель B:

B.objects.filter(a_id=1).values('user', 'content').distinct().count()

Это очень простой ответ.

A.objects.annotate(count=Count("b__user", distinct=True)).get(pk=pk)
Вернуться на верх