Django select filtered related object

У меня есть 3 модели:

class ForumTopic(models.Model):
    author          = models.ForeignKey('auth.User', on_delete=models.CASCADE)
    title           = models.CharField(max_length=100) 

class ForumMessage(models.Model):
    topic           = models.ForeignKey(ForumTopic, on_delete=models.CASCADE)
    author          = models.ForeignKey('auth.User', on_delete=models.CASCADE)

class ForumMessageVote(models.Model):
    user            = models.ForeignKey('auth.User',    on_delete=models.CASCADE)
    message         = models.ForeignKey(ForumMessage,   on_delete=models.CASCADE)
    vote          = models.IntegerField(default=0)

Я хочу выбрать все ForumMessage для конкретной ForumTopic и прикрепить к результату этого запроса ForumMessageVote отфильтрованный по конкретному User и текущему ForumMessage.

Как я могу это сделать?

Думаю, вам нужно отфильтровать ForumMessageVote объекты

Необходимая вам информация будет доступна через результаты набора запросов

ForumMessageVote.objects.filter(
    user = the_selected_user, 
    message__topic = the_selected_topic 
).select_related(
    'message', 'message__topic' )

Если вы уже знаете идентификаторы пользователя или темы, например, через URL, то вы можете фильтровать user_id=uid или message__topic_id=tid

ForumMessages= ForumMessage.objects.filter(topic="specificTopic")
ForumMessageVotes=ForumMessageVote.object.filter(message__in=ForumMessages)

Я нашел решение с помощью подзапроса (я проверил в консоли python, и он работает):

vote=ForumMessageVote.objects.filter(message=OuterRef("pk")).filter(user=request.user)
messages=ForumMessage.objects.all().annotate(user_vote=Subquery(vote.values('vote')[:1]))

Как получить голос в просмотре:

v=messages.objects.get(author=request.user).user_vote

В шаблоне:

{% for msg in messages %}
{{message.uservote}}
{% endif %}
Вернуться на верх