HOWTO · Django

Django の Select_related メソッド

この記事では、クエリ セットとは何か、これらのクエリを操作する方法、select_related() メソッドを使用して Django で関連モデルのクエリをフィルタリングする方法を示します。

このページの内容

この記事では、クエリ セット、これらのクエリの操作方法、および Django での select_related() メソッドの使用方法に取り組みます。 Django フレームワークを使用している間は、主に クエリ セット を使用します。

データベースがあり、クエリを実行するとします。 supplier と呼ばれるモデルがあり、この supplier を使用してすべてのサプライヤーを取得するとします。そのため、サプライヤーのリストを作成し、そのリストを クエリ セット と呼びます。 .

ロジックを書き、2つのモデルを作成する views.py ファイルを見ていきます。 select_related() メソッドの使用例を説明するコードを書き始めます。

まず、objects.all() を使用して従業員を取得しました。 その従業員のリストをループし、emplyee.name を使用して従業員名を出力する必要があります。

コード:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all()
    for emplyee in employees:
        print(emplyee.name)

出力:

Jane Doe
John Doe
Simpson
John Simpson

デバッグ ツールを使用してブラウザーに移動すると、すべての従業員と対応する部門とその詳細が取得されることがわかります。 objects.all() により、すべての従業員が選択され、すべての詳細が取得されます。

問題は、関連モデルにアクセスしたときに始まります。 たとえば、models.py ファイルを調べると、関連モデルである employee モデルは department そのものです。

次のコードを使用して、従業員名と部署名を出力します。

コード:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all()
    for emplyee in employees:
        print(emplyee.name, emplyee.department.name)

上記のコードでは emplyee.department を使用しており、部門は外部キーです。 部門名がどこにあるかという department オブジェクトが表示されます。

出力:

Jane Doe HR
John Doe Accounts
Simpson Purchase
John Simpson Purchase

Django デバッグ ツールを使用して Django アプリケーションを実行しているときにブラウザにアクセスすると、複数のクエリが表示されます。 最初のクエリではすべての従業員が選択され、2 番目のクエリでは ID が 1 の部門が選択されていることがわかります。

employee の ID が同じである場合、ORM はそのテーブルに 2 回アクセスし、重複をフェッチします。 会社に 100 人の従業員がいるとすると、101 クエリが実行されるため、部門 からは 100 クエリ、employee からは 1つのクエリが実行されます。

これは、ORM の古典的な無限問題としても知られています。 select_related() メソッドを使用して、これらの従業員とそれに対応する部門を取得します。メソッドでモデルのフィールドを渡す必要があります。

したがって、フィールドは関連していることが理にかなっています。この場合、フィールドを部門として使用します。

コード:

from company.models import Department, Employee


def home(request):
    employees = Employee.objects.all().select_related("department")
    for emplyee in employees:
        print(emplyee.name, emplyee.department.name)