【发布时间】:2019-10-10 07:32:19
【问题描述】:
我有两个模型:
class User(Model):
...
class Message(Model):
sender = ForeignKey(User, CASCADE, 'sent_msgs')
receiver = ForeignKey(User, CASCADE, 'rcvd_msgs')
ignored = BooleanField()
我正在尝试使用用户相关消息的总和来注释用户的查询集,即 sent_msgs 和 rcvd_msgs 的总和。此外,任何带有ignored=True 的消息都应被忽略。
我可以很简单地用RawSQL 做到这一点,使用子查询:
SELECT COUNT("messages_message"."id")
FROM "messages_message"
WHERE "messages_message"."ignored" = FALSE
AND (
"messages_message"."sender_id" = "users_user"."id"
OR
"messages_message"."receiver_id" = "users_user"."id"
)
queryset = queryset.annotate(msgs_count=RawSQL(that_query_above))
有没有办法在不使用RawSQL 的情况下做到这一点?
【问题讨论】:
-
我认为您应该使用 django 的条件表达式,您可以在 django documentation 中所述的过滤器、注释、聚合和更新中使用
ifelifelse逻辑 -
@dipbazz 尝试了很多,但无法让它工作。问题是他们生成了两个
JOINs 而不是一个子查询,这导致行数比实际多。
标签: django django-models django-queryset django-orm