Djangoアプリケーションで次のクエリを使用しています。ユーザーフィールドは外部キーです。結果には、1000個のMyModelオブジェクトが含まれていますが、ユーザーのほんの一部です。クエリのuser__in=
部分にユーザーごとに返される5つのMyModelオブジェクトに制限したいと思います。私は5 *#ユーザー以下のMyModelオブジェクトで終わるはずです。Django ORMクエリーセットを制限してデータのサブセットのみを返す
lfs = MyModel.objects.filter(
user__in=[some,users,here,],
active=True,
follow=True,
)
ORMまたはSQL(Postgresを使用)のいずれかを使用できます。
おかげ
EDIT 2
は、私は以下の答えとして追加した、これは終らする簡単な方法を見つけました。どれも本当にPostgresのか、DjangoのORMで働いていないものの
EDIT
は、コメントに記載されたリンクのいくつかは、いくつかの良い情報を持っていました。将来この情報を探している他の人のために、他の質問/執筆者のコードの私の適応がここにあります。
これは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個だけでなくすべての行が返されるという欠点があります。
の可能重複[ジャンゴ:?それぞれの外部キーの行の限られた量を選択する方法](http://stackoverflow.com/questions/6705579/django-how-to-select-a-limited - 各外部キーの行数) – DrTyrsa
** **は重複しています。チェックしたところ、他の質問の回答、特にコードの最初の断片がこの質問に答えているようです。 – jpic
ところで、これはトップnクエリと呼ばれます。 – jpic