[sql] Django in / not in query
django에서 ‘not in’스타일 쿼리를 작성하는 방법을 알아 내려고합니다. 예를 들어 내가 생각하는 쿼리 구조는 다음과 같습니다.
select table1.*
from table1
where table1.id not in
(
select table2.key_to_table1
from table2
where table2.id = some_parm
)
django 구문은 table1 및 table2라는 모델을 가정하면 어떻게 생겼습니까?
답변
table1.objects.exclude(id__in=
table2.objects.filter(your_condition).values_list('id', flat=True))
제외 기능은 Not
요청 하는 연산자 처럼 작동 합니다. 이 속성 flat = True
은 table2
쿼리에를 value_list
한 수준 목록으로 반환하도록 지시 합니다. 그래서 … 끝에 IDs
table2에서 목록을 얻습니다. 에서 조건을 정의하기 위해 사용자 table1
가 될 것이며 제외 기능에 의해 거부됩니다.
답변
이 모델 :
class table1(models.Model):
field1 = models.CharField(max_length=10) # a dummy field
class table2(models.Model):
key_to_table1 = models.ForeignKey(table1)
다음을 사용하여 원하는 것을 얻어야합니다.
table1.objects.exclude(table2=some_param)
답변
table1.objects.extra(where=["table1.id NOT IN (SELECT table2.key_to_table1 FROM table2 WHERE table2.id = some_parm)"])
답변
Django 쿼리에 대한 사용자 지정 조회를 작성할 수 있습니다.
로부터 문서 :
“. 간단한 사용자 정의 조회와하자의 시작 우리는 사용자 정의 조회 작성합니다 NE 하는 반대 작동 정확한을 . Author.objects.filter (name__ne = ‘잭’) 는 SQL로 변환됩니다 "author"."name" <> 'Jack'
“
from django.db.models import Lookup
class NotEqual(Lookup):
lookup_name = 'ne'
def as_sql(self, compiler, connection):
lhs, lhs_params = self.process_lhs(compiler, connection)
rhs, rhs_params = self.process_rhs(compiler, connection)
params = lhs_params + rhs_params
return '%s <> %s' % (lhs, rhs), params
답변
[o1 for o1 in table1.objects.all() if o1.id not in [o2.id for o2 in table2.objects.filter(id=some_parm)]]
또는 더 나은
not_in_ids = [obj.id for obj in table2.objects.filter(id=some_parm)]
selected_objects = [obj for obj in table1.objects.iterator() if obj.id not in not_in_ids]