Показать два разных столбца в аннотации 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)