我\xe2\x80\x99m 尝试执行高级 SQL 查询,但我无法\xe2\x80\x99t 弄清楚如何执行此操作。\n我的目标是为论坛实现读/未读系统,因此我有以下内容模型(不完整:\n简洁)
\n\nclass 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\nRun Code Online (Sandbox Code Playgroud)\n\n我认为这是非常不言自明的:主题可以标记为已读。用户每个主题有零个或一个 ReadActivity。(事实上,论坛也是可读的,但这超出了这个问题的范围)
\n\n所以:我希望能够获取论坛列表,并为每个论坛确定它是否已读或未读(对于给定用户)\n我的方法是:\n对于每个论坛,如果任何主题没有任何 ReadActivity 或ReadActivity where read_until < last_message,将论坛标记为未读。
\n\n说到 SQL,我会通过以下方式做到这一点:
\n\nSELECT 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)