【发布时间】:2015-09-20 18:39:51
【问题描述】:
我的 Django 模型是这样的:
class User(models.Model):
username = models.CharField(max_length=32)
class Message(models.Model):
content = models.TextField()
class UserMessageRel(models.Model):
user = models.ForeignKey(User)
message = models.ForeignKey(Message)
is_read = models.BooleanField()
现在我想获取所有消息,对于每条消息,我需要知道有多少收到它的用户阅读了它。
天真的做法是:
msgs = Message.objects.all()
messages = []
for msg in msgs:
reads = UserMessageRel.objects.filter(message=msg, is_read=True).count()
messages.append((msg, reads))
但是这样效率很低,用 SQL 查询来获取每条消息的读取次数。
我不确定这是否可以通过 ORM 中的注释或聚合来完成?
我想要的是这样的:
msgs_with_reads = Message.objects.all().annotate(
number_of_reads=Count("user_message_rel_with_is_read_true"))
可以翻译成一个很好的 SQL 查询。
这可以实现吗?
【问题讨论】:
-
我认为是,但是当我尝试它时,它也相当复杂。我现在没有代码 sn-p,但我认为它涉及
group()并且可能使用反向关系。最后的手段总是使用.sql()
标签: python django django-models orm