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=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 %}
{{msg.user_vote}}
{% endif %}
我有 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=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 %}
{{msg.user_vote}}
{% endif %}