小编Alg*_*lgo的帖子

如何预取计数并使用它来注释 Django ORM 中的查询集

我\xe2\x80\x99m 尝试执行高级 SQL 查询,但我无法\xe2\x80\x99t 弄清楚如何执行此操作。\n我的目标是为论坛实现读/未读系统,因此我有以下内容模型(不完整:\n简洁)

\n\n
class ReadActivity(models.Model):\n    content_object = GenericForeignKey(\'content_type\', \'object_id\')\n    reader = models.ForeignKey(User, null=False, blank=False)\n    read_until = models.DateTimeField(blank=False, null=False, default=timezone.now)\n    class Meta:\n        unique_together = (("content_type", "object_id", "reader"),)\n\nclass Readable(models.Model):\n    read_activities = GenericRelation(ReadActivity)\n    class Meta:\n        abstract = True\n\nclass Forum(models.Model):\n    pass\nclass Topic(Readable):\n    pass\n
Run Code Online (Sandbox Code Playgroud)\n\n

我认为这是非常不言自明的:主题可以标记为已读。用户每个主题有零个或一个 ReadActivity。(事实上​​,论坛也是可读的,但这超出了这个问题的范围)

\n\n

所以:我希望能够获取论坛列表,并为每个论坛确定它是否已读或未读(对于给定用户)\n我的方法是:\n对于每个论坛,如果任何主题没有任何 ReadActivity 或ReadActivity where read_until < last_message,将论坛标记为未读。

\n\n

说到 SQL,我会通过以下方式做到这一点:

\n\n
SELECT COUNT("forums_topic"."id")\nFROM "forums_topic"\n  LEFT JOIN "reads_readactivity"\n    ON ("forums_topic"."id" = "reads_readactivity"."object_id" AND "reads_readactivity"."content_type_id" = \'11\')\nWHERE (("reads_readactivity"."id" IS NULL\n        OR ("reads_readactivity"."reader_id" = \'1\' AND "reads_readactivity"."read_until" …
Run Code Online (Sandbox Code Playgroud)

python sql django orm

5
推荐指数
0
解决办法
961
查看次数

标签 统计

django ×1

orm ×1

python ×1

sql ×1