1. ホーム
  2. ジャンゴ

[解決済み】Django - クエリ結果を制限する

2022-04-07 02:59:20

質問

あるモデルの過去10個のインスタンスを取得したいのですが、以下のようなコードがあります。

 Model.objects.all().order_by('-id')[:10]

まず、すべてのインスタンスをピックアップして、最後の10個だけを取るというのは本当ですか? もっと効果的な方法はないのでしょうか?

どのように解決するのですか?

Django のクエリセットはレイジーです。つまり、クエリは具体的に結果を求めるときだけ、データベースをヒットします。

そのため、クエリの結果を印刷するか実際に使用するまでは、データベースにアクセスすることなく、さらにフィルタリングを行うことができます。

以下のように、このコードでは最後の10件だけを取得するために、1つのSQLクエリを実行するだけです。

In [19]: import logging                                 
In [20]: l = logging.getLogger('django.db.backends')    
In [21]: l.setLevel(logging.DEBUG)                      
In [22]: l.addHandler(logging.StreamHandler())      
In [23]: User.objects.all().order_by('-id')[:10]          
(0.000) SELECT "auth_user"."id", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."password", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."is_superuser", "auth_user"."last_login", "auth_user"."date_joined" FROM "auth_user" ORDER BY "auth_user"."id" DESC LIMIT 10; args=()
Out[23]: [<User: hamdi>]