gpt4 book ai didi

django - 用是否存在匹配的相关对象来注释查询集

转载 作者:行者123 更新时间:2023-12-02 06:45:58 24 4
gpt4 key购买 nike

我有两个具有显式多对多关系的模型:一个事物 auth.user 和一个连接这两个模型的“最喜欢的”模型。我希望能够根据特定用户是否喜欢我的“东西”来对其进行排序。在 Sqlite3 中,我想出的最好的查询(大致)是这样的:

select 
*, max(u.name = "john cleese") as favorited
from thing as t
join favorite as f on f.thing_id = t.id
join user as u on f.user_id = u.id
group by t.id
order by favorited desc
;

在我的 sql 到 django 翻译中让我困惑的是 max(u.name = "john cleese")少量。据我所知,Django 支持算术,但不支持相等。我能得到的最接近的是一个 case 语句,它没有正确地对输出行进行分组:

Thing.objects.annotate(favorited=Case(
When(favorites__user=john_cleese, then=Value(True)),
default=Value(False),
output_field=BooleanField()
))

我尝试过的另一个方向是使用 RawSQL :

Thing.objects.annotate(favorited=RawSQL('"auth_user"."username" = "%s"', ["john cleese"]))

但是,这行不通,因为(据我所知)没有办法显式加入 favoriteauth_user我需要的表。

我有什么遗漏吗?

最佳答案

这将实现您(或任何其他在这里谷歌搜索的人)想要做的事情:

Thing.objects.annotate(
favorited=Count(Case(
When(
favorites__user=john_cleese,
then=1
),
default=0,
output_field=BooleanField(),
)),
)

关于django - 用是否存在匹配的相关对象来注释查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40599681/

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