gpt4 book ai didi

python - Django ORM 限制查询集只返回数据的一个子集

转载 作者:行者123 更新时间:2023-11-29 13:36:29 27 4
gpt4 key购买 nike

我在 Django 应用程序中有以下查询。用户字段是一个外键。结果可能包含 1000 个 MyModel 对象,但仅针对少数用户。我想在查询的 user__in= 部分将其限制为每个用户返回 5 个 MyModel 对象。我应该以 5*#users 或更少的 MyModel 对象结束。

lfs = MyModel.objects.filter(
user__in=[some,users,here,],
active=True,
follow=True,
)

通过 ORM 或 SQL(使用 Postgres)都可以。

谢谢

编辑 2

找到了一种更简单的方法来完成这项工作,我已将其添加为下面的答案。

编辑

评论中提到的一些链接有一些很好的信息,尽管没有一个真正适用于 Postgres 或 Django ORM。对于将来寻找此信息的任何其他人,我在此处对其他问题/答案中的代码进行了改编。

为了实现这是 postgres 9.1,我必须使用 pgperl 创建几个函数(这也需要我安装 pgperl)

CREATE OR REPLACE FUNCTION set_int_var(name text, val bigint) RETURNS bigint AS $$
if ($_SHARED{$_[0]} = $_[1]) {
return $_[1];
} else {
return $_[1];
}
$$ LANGUAGE plperl;

CREATE OR REPLACE FUNCTION get_int_var(name text) RETURNS bigint AS $$
return $_SHARED{$_[0]};
$$ LANGUAGE plperl;

我的最终查询如下所示

SELECT x.id, x.ranking, x.active, x.follow, x.user_id
FROM (
SELECT tbl.id, tbl.active, tbl.follow, tbl.user_id,
CASE WHEN get_int_var('user_id') != tbl.user_id
THEN
set_int_var('rownum', 1)
ELSE
set_int_var('rownum', get_int_var('rownum') + 1)
END AS
ranking,
set_int_var('user_id', tbl.user_id)
FROM my_table AS tbl
WHERE tbl.active = TRUE AND tbl.follow=TRUE
ORDER BY tbl.user_id
) AS x
WHERE x.ranking <= 5
ORDER BY x.user_id
LIMIT 50

唯一的缺点是,如果我试图通过使用 user_id IN () 来限制它查找的用户,整个过程就会崩溃,它只会返回每一行,而不是每个用户 5 个。

最佳答案

这就是最终起作用的,并允许我只选择少数用户或所有用户(通过删除 AND mt.user_id IN () 行)。

SELECT * FROM mytable
WHERE (id, user_id, follow, active) IN (
SELECT id, likeable, user_id, follow, active FROM mytable mt
WHERE mt.user_id = mytable.user_id
AND mt.user_id IN (1, 2)
ORDER BY user_id LIMIT 5)
ORDER BY likeable

关于python - Django ORM 限制查询集只返回数据的一个子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9512516/

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