2016-07-29 2 views
0

그래서이 매개 변수에 의해 MODELA 필터 queryset1이 : 그럼장고 : 검색어 세트 내부 루프의 검색어

queryset1 = ModelA.objects.all().filter(par1="X",par2="Y") 

을 나는이 이미 queryset1에 의해 필터링 된 요소를 잡아서 ModelB를 필터링하려는 다른 queryset2

queryset2 = ModelB.objects.all().filter(par3="X" for i in queryset,par4="Z") 

내 질문은 : 이미 만들어 가지고의 검색어에 검색어 세트를 수행 할 수있는 방법이 있나요, 또한 그것은 또 다른 매개 변수에 따라? 결국 par1 par2 par3을 따르는 ModelA와 ModelB의 객체를 가져 오려고합니다. 어떻게하면 좋을까요?

+1

내가 무엇을하려고하는지 이해하지 못한다. 모델을 보여줄 수 있습니까? 'ModelA'와'ModelB'의 관계는 무엇입니까? 너는'내가 열거 한 것 '으로 무엇을하려 하는가? –

+0

ModelA와 ModelB에는 동일한 객체가 있지만 일부 다른 객체가 있습니다. 두 모델에서 동일한 객체를 잡고 그 객체에 대한 필터를 만들고 싶습니다. –

+0

모델 사례를 게시하여 조금 더 분명하게하십시오. – Justin

답변

1

for 루프 없이는 가능합니다. for 루프를 사용할 때의 단점은 실제로 두 개의 쿼리를 실행하고 첫 번째 쿼리를 검색한다는 것입니다. 많은 행이 생성되는 경우 리소스가 소모되어 응답 시간이 느려집니다.

: 당신은 동적 값 목록을 평가하기의 검색어를 사용 대신 리터럴 값의 목록을 제공 할 수 https://docs.djangoproject.com/en/1.9/ref/models/querysets/

에서 설명 된 바와 같이

queryset2 = ModelB.objects.all().filter(par3__in=queryset,par4="Z") 

이 하위 쿼리 초래

SELECT * FROM app_modelb where par3 IN (SELECT ...) 
1

당신이 할 수있는 것은 :

  1. par3queryset1의 동일한 유형의 relation 경우 :

    queryset2 = ModelB.objects.all().filter(par3__in=queryset1, par4="Z") 
    
  2. values_list('some_field', flat=True) 표기법을 사용 part3relation

    하지 않을 때
    queryset2 = ModelB.objects.all().filter(par3__in=queryset1.values_list('X', flat=True), par4="Z")