自身を呼び出しているモデルのデータを使ってフィルタリングする
from django.db.models import Subquery, OuterRef last_sales_date = Sales.objects.filter( name=OuterRef('pk') ).order_by('-date').values('date')[:1] model = Person.objects.annotate( last_sale_date=Subquery(last_sales_date)) print(model.values('name', 'last_sale_date'))
SubqueryとOuterRefを使用することによって、自身を呼び出しているデータを使用してフィルタリングし、そのデータをannotateで追加することができます。
Subqueryは複数データがある状態が返ってくるとエラーになるので返ってくるデータが1つになるようにしてください。
上の例は、OuterRefを使用して、自身を呼び出しているモデル(Person)のpkを使用してフィルタリングしています。
last_sales_dateはnameフィールドが自身を呼び出しているモデルのpkのデータを取得し、それをdateで降順にし、最初の1件目を取得しています。
Subqueryはannotateにほかのモデルのデータを埋め込むのに使用され、ここでは、変数last_sales_dateで処理された結果がlast_sale_dateフィールドに代入されています。
上の例では、PersonモデルごとのSalesモデルのsaleが最新のもの(最終売上日)をlast_sale_dateフィールドに代入している例となります。
Subqueryは複数データがある状態が返ってくるとエラーになるので返ってくるデータが1つになるようにしてください。
上の例は、OuterRefを使用して、自身を呼び出しているモデル(Person)のpkを使用してフィルタリングしています。
last_sales_dateはnameフィールドが自身を呼び出しているモデルのpkのデータを取得し、それをdateで降順にし、最初の1件目を取得しています。
Subqueryはannotateにほかのモデルのデータを埋め込むのに使用され、ここでは、変数last_sales_dateで処理された結果がlast_sale_dateフィールドに代入されています。
上の例では、PersonモデルごとのSalesモデルのsaleが最新のもの(最終売上日)をlast_sale_dateフィールドに代入している例となります。