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 %}