gpt4 book ai didi

Django:M2M数据库注解查询

转载 作者:搜寻专家 更新时间:2023-10-30 23:26:17 27 4
gpt4 key购买 nike

给定以下模型:

User
--------

Thread
--------

Post
--------
thread: ForeignKey(Thread)
read_by: ManyToManyField(User)

现在,我想检索特定线程的所有帖子,如果它们被当前登录的用户阅读,则注释。

所以,我从获取帖子开始:

Post.objects.filter(thread=self.thread)

现在,我不确定如何使用设置为 True/False 的已读/未读标志进行注释。使用变量 self.request.user 可以获得当前登录的用户。

最佳答案

我们可以在这里创建一个 EXISTS 子查询,通过查询隐式构造的“through”模型 Django:

from django.db.models import Exists, OuterRef

post_read_query = Post.ready_by.through.objects.filter(
user_id=self.request.user.pk,
<b>post_id=OuterRef('pk')</b>
)

然后我们在 Exists subquery [Django-doc] 中使用这个 post_read_query :

Post.objects.filter(thread=self.thread).annotate(
<b>is_read=Exists(post_read_query)</b>
)

由此产生的 Post 对象将有一个额外的属性 .is_read 给定 PostTrue > 已被用户读取 (self.request.user)。

这将生成如下所示的查询:

SELECT post.*,
EXISTS(
SELECT U0.id, U0.user_id, U0.post_id
FROM post_read_by U0
WHERE U0.post_id = post.id AND U0.user_id = <i>user_id</i>
) AS is_read
FROM post
WHERE post.thread_id = <i>thread_id</i>

关于Django:M2M数据库注解查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57293445/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com