2012-07-06 2 views
2

내가 가진 같은 모델 : 나는 사용자가 입력 한 범주의 목록을 가지고매개 변수가있는 Django ManyToManyField 필터?

class Category(Model): 
    ... 
    type = models.CharField(max_length=255, choices=settings.CATEGORIES) 

class Product(models.Model): 
    ... 
    categories = models.ManyToManyField(Category) 

(형식은 임의) :

c = [<Category: G, type: producer>, <Category: L, type: producer>, <Category: Teen, type: age>, <Category: Man, type: sex>] 

지금 내가 부문에서 'G가 모든 제품을 갖고 싶어 '또는'L '(유형'생산자 '),'Teen '(유형'연령 ') 및'Man '(유형)'sex ' 나는 예를 들어 다음의 검색어에 대한 일을 해요 :

SELECT "shop_product"."id", "shop_product"."title", "shop_product"."description", 
"shop_product"."price", "shop_product"."code", "shop_product"."stored_count", 
"shop_product"."sold_count", "shop_product"."added_date" FROM "shop_product" 
INNER JOIN  "shop_product_categories" ON ("shop_product"."id" = 
"shop_product_categories"."product_id") WHERE 
(("shop_product_categories"."category_id" = 1 OR 
"shop_product_categories"."category_id" = 2) AND  
"shop_product_categories"."category_id" = 4 AND 
"shop_product_categories"."category_id" = 6) 

나는 적어도 하나의 개체가 이러한 요구 사항에 가장 적합한,하지만 아무것도 돌려주지의 검색어 : 같은 쿼리를

Product.objects.filter(Q(categories=c[0])|Q(categories=c[1]), Q(categories=c[2]), Q(categories=c[3]) 

. 어떤 제안?

답변

2

캐스 케이 딩 필터링을 수행해야합니다. 그렇지 않으면 현재 선택은 "shop_product_categories"."category_id" 값이 1/2과 4 및 6 인 모든 제품을 동시에 반환합니다. 다음은 원하는 결과를 반환하는 예제 쿼리 세트입니다 :

다음과 같은 SQL을 생성
Product.objects.filter(categories__in=c[0:2]) 
       .filter(categories=c[2]) 
       .filter(categories=c[3]) 
       .distinct() 

:

SELECT DISTINCT "test1_product"."id" FROM "test1_product" INNER JOIN "test1_product_categories" ON ("test1_product"."id" = "test1_product_categories"."product_id") 
    INNER JOIN "test1_product_categories" T4 
     ON ("test1_product"."id" = T4."product_id") 
    INNER JOIN "test1_product_categories" T6 
     ON ("test1_product"."id" = T6."product_id") 
WHERE ("test1_product_categories"."category_id" IN (1, 2) 
    AND T4."category_id" = 3 
    AND T6."category_id" = 4) 
+0

감사합니다, 그것이 내가해야 할 것처럼 작동합니다! –

관련 문제