2012-02-04 1 views
1

manyToManyField 관계 의 멤버가 정확히의 멤버가 주어진 객체 목록과 일치하는지 여부를 확인하여 객체를 쿼리하는 방법은 무엇입니까?장고에있는 ManyToManyField의 정확한 내용에 대한 쿼리

class Topping(models.Model): 
    # ... 

class Pizza(models.Model): 
    # ... 
    toppings = models.ManyToManyField(Topping) 

내가 정확히 페퍼로니와 양파가 모든 피자 싶어

주어진 예를 들어

:

pep = Topping(name='pepperoni') 
pep.save() 
onion = Topping(name='onion') 
onion.save() 
tops = [pep, onion] 
p = Pizza.objects.filter(toppings__eq=tops) 

장고가 __in 연산자를 제공합니다,하지만 __eq. 어떻게해야합니까?

감사합니다.

답변

-2

그냥 당신이 원하는 것을 얻을 수 있도록 필터를 체인 : 나는이 작업을 수행하는 더 좋은 방법 건너하지 않은

pep = Topping(name='pepperoni') 
pep.save() 
onion = Topping(name='onion') 
onion.save() 
tops = [pep, onion] 
p = Pizza.objects.filter(toppings__id=pep.id).filter(toppings__id=onion.id) 

.

+1

이것은 작동하지 않습니다. 이것은 여전히 ​​추가 토핑이있는 피자를 받아 들일 것입니다. – Neil

1

모든 토핑을 걸러 내고 지정한 토핑의 수와 정확히 일치하는 피자를 선택하는 것은 어떻습니까?

from django.db.models import Q 
import operator 
pizza = (Pizza.objects 
    .filter(reduce(operator.or_, [Q(toppings=topping) for topping in tops])) 
    .annotate(count=Count('toppings')) 
    .filter(count=len(tops)) 
    ) 
+0

겉으로보기에는 단순합니다. 다른 아이디어? – Neil

+0

@NP., 죄송합니다. 정확한 아이디어를 얻을 수있는 다른 아이디어가 없습니다. "토핑 XYZ와 정확한 토핑 (XYZ) 토핑을 가진 피자를 찾아보십시오." –

+0

나는 operator.or_의 사용이 잘못된 논리라고 생각한다고 말합니다. 토핑 길이가 같고 Q 객체의'또는'평가가 ~로 평가되기 때문에'[ 'Sausage', 'Pepperoni']'주제의 피자 객체는'' 'Onion', 'Pepperoni' '' 'topics = 'Pepperoni'와 일치 할 때 참입니다. 'to' 비교를 얻기 위해 각각의 토핑을 연속적으로 걸러 내고 싶습니다. – garromark

관련 문제