2011-12-19 78 views
23

どうすればdjangoのクエリーセットでサブクエリできますか?たとえば、私が持っている場合: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

あなたの例はあまり良くありません。 'select name、personからのage、person.id = employee.id、およびemployee.company = 'Private''のサブクエリは不要です。 –

答えて

11
ids = Employee.objects.filter(company='Private').values_list('id', flat=True) 
Person.objects.filter(id__in=ids).values('name', 'age') 
+14

これはサブクエリではなく、' values_list'はaを返しません。クエリーセット。これにより、2つの別々のクエリが行われます –

+1

サブクエリではなく、わずか2つのクエリです。 – Egg

+7

'values_list'は' ValuesQuerySet'を返し、その2行は実際にサブクエリを持つ単一のクエリに変換されます。 – BBT

31

ypercubeご利用の場合で述べたように、副問合せを必要としません。

しかし、とにかくこのページにサブクエリする方法を学ぶために多くの人がこのページにリンクしているので、ここでその方法を説明します。

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

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

+0

docs:https://docs.djangoproject.com/en/1.9/ref/models/querysets/#in "にも記載されているように、クエリセットを使用してリテラル値のリストを提供する代わりに、値のリストを動的に評価することができます: "このクエリーセットは副選択文として評価されます"。 –

6

あなたはあなたの主なクエリセットをフィルタリングするunevaluated querysetを使ってDjangoの中でサブクエリを作成することができます。私はあなたがPersonemployeeという名前Employeeまでとは逆の関係を持っていることを仮定してい

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

:あなたのケースでは、それは次のようになります。フィルタの仕組みを理解しようとしていたときにクエリセットによって生成されたSQLクエリを調べると便利です。

print people.query 

他にも、あなたの例ではサブクエリは必要ありません。

people2 = Person.objects.filter(employee__company='Private') 
関連する問題