Django select 筛选相关对象

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)

我想 select 所有 ForumMessage 特定 ForumTopic 并附加到此查询的结果 ForumMessageVote 由特定 User 和当前 ForumMessage.

过滤

我该怎么做?

我认为您需要过滤 ForumMessageVote 个对象

您需要的信息将通过查询集的结果提供

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

如果您已经知道用户或主题的 ID,例如通过 URL,那么您可以过滤 user_id=uidmessage__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 %}
{{msg.user_vote}}
{% endif %}