2014-01-24 4 views
1

그래서 나는 다음과 같이 시작하는 쿼리를 만드는 중이라서. 그러면 Example 중 처음으로 연결된 객체가 모두 FooBar이됩니다. 다른 필드는, target, 구별되지 않습니다 말할 수 어디장고가 아닌 별개의 쿼리

나는이 검색어 세트 을 갖고 싶어

FooBar 객체를 포함하지만 여기 내 목표입니다.

target_ids = [] #holding a check list for comparison 
correct_targets = [] #holding the objects I want to have 
for item in queryset: #iteration 
    target_ids.append(item.example.pk) #send primary key to check list 
    if target_ids.count(item.example.pk) == 2: #check if there has been more than one (if there is more than two I don't send another correct target since I would have already sent it previously) 
     correct_targets.append(item) #send correct target 

난을 반복 할 필요없이 내 queryset에서 이러한 개체의 검색어 세트를 얻을 수있는 방법이있을 것이라고 기대했다 :

나는 다음과 같은 루프가 있다고 할 수 있습니다. 이것이 가능합니까?

답변

1

filtering on annotation을 사용하는 것이 가능합니다.

from django.db.models import Count 
qs = FooBar.objects.filter(example__pk__lt=50) 
qs = qs.annotate(num_examples=Count('example')).filter(num_examples__gt=1) 
0

Django ORM에서 "역 분개"가 가능하거나 기본 SQL 데이터베이스가 아닌지 확실하지 않습니다.

그러나 다음의 1 분기에게의 검색어에

  1. 쿼리 모든 항목 수도있을

  2. 의 차이를 가지고 Q2에게

  3. 을의 검색어하기

    쿼리되는 중복 항목 qs_not_distict = qs1.exclude(pk__in=qs2)

0

당신은 aggrega를 사용할 수 있습니다. 테 쿼리를 사용하여 비 식별 항목 목록을 얻은 다음이를 사용하여 다른 쿼리를 필터링하십시오.

nondistinct = Example.objects.values('target').annotate(Count('id')).filter(id__count__gt=1) 
Foobar.objects.filter(example__pk__lt=50).filter(example__target__in=[item['target'] for item in nondistinct])