Django の Select_related メソッド
この記事では、クエリ セット、これらのクエリの操作方法、および Django での select_related()
メソッドの使用方法に取り組みます。 Django フレームワークを使用している間は、主に クエリ セット
を使用します。
データベースがあり、クエリを実行するとします。 supplier
と呼ばれるモデルがあり、この supplier
を使用してすべてのサプライヤーを取得するとします。そのため、サプライヤーのリストを作成し、そのリストを クエリ セット
と呼びます。 .
select_related()
メソッドを使用して、Django でモデルの関連クエリをフィルタリングする
ロジックを書き、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)
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn