djangoのquerysetでサブクエリする方法は?

どのように私はdjangoのquerysetでサブクエリを持つことができますか?例えば私が持っている場合:

select name, age from person, employee where person.id = employee.id and
employee.id in (select id from employee where employee.company = 'Private')

これは私がまだやったことです。

Person.objects.value('name', 'age')
Employee.objects.filter(company='Private')

それは2つの出力を返すため動作していません...

24
あなたの例はあまり良くありません。 select name、personからのage、employee.id = employee.id、およびemployee.company = 'Private' のサブクエリは必要ありません。
追加された 著者 ypercubeᵀᴹ,

3 答え

ypercubeで述べたように、ユースケースにサブクエリは必要ありません。

しかし、とにかく多くの人々がこのページにサブクエリを行う方法を学ぶためにここに来るので、それはどのように行われます。

employee_query = Employee.objects.filter(company='Private').only('id').all()
Person.objects.value('name', 'age').filter(id__in=employee_query)

Source: http://mattrobenolt.com/the-django-orm-and-subqueries/

34
追加された
ドキュメントに記載されています: docs.djangoproject.com/ja/1.9/ref/models/querysets /#in "は、クエリーセットを使用して、リテラル値のリストを提供する代わりに、値のリストを動的に評価することもできます:"および "このクエリーセットは副選択ステートメントとして評価されます。
追加された 著者 Ciro Santilli 包子露宪 六四事件 法轮功,
ids = Employee.objects.filter(company='Private').values_list('id', flat=True)
Person.objects.filter(id__in=ids).values('name', 'age')
14
追加された
サブクエリではなく、2つのクエリ。
追加された 著者 Egg,
これはサブクエリではありませんが、 values_list はクエリーセットを返しません。これにより、2つの別々のクエリが行われます
追加された 著者 Antoine Pinsard,
これは、実際にたった1つのクエリを生成します。つまり、正しい答えです。さらに、1. .values( 'id')はまったく同じです。2.代わりに pk フィールドの使用をお勧めします。
追加された 著者 emyller,
values_list ValuesQuerySet を返します。これらの2行は実際にサブクエリを持つ単一のクエリに変換されます。
追加された 著者 BBT,

Djangoでサブクエリを作成するには、未評価クエリーセットを使用します。メインクエリセットをフィルタリングします。あなたの場合は、次のようになります。

employee_query = Employee.objects.filter(company='Private')
people = Person.objects.filter(employee__in=employee_query)

私はあなたが Person から Employee employee という逆の関係を持っていると仮定しています。フィルタの仕組みを理解しようとしていたときにクエリセットによって生成されたSQLクエリを調べると便利です。

print people.query

他の人が言っているように、実際にはあなたの例のためにサブクエリは必要ありません。あなたは従業員テーブルに参加することができます:

people2 = Person.objects.filter(employee__company='Private')
6
追加された