2014-09-09 4 views
1

나는 다음과 같은 데이터에 문제가 생겼어요 예를 들어장고 ManyToMany 쿼리 또는 문제

: 18,000-20,000 $

의 가격 범위에서 2014 년에 판매되는 모든 차량이 특정 년 가격의 값과 일치 617,451,515,

은 (해야한다 네, 우리의 예에서 아무 것도 반환하지 않습니다?)

그래서이 쿼리 필자가 만든 : 그것은 가정 할 때

Car.objects.filter(year_price_data__year=2014) 

.filter(Q(year_price_data__min_price__lte=20000,year_price_data__min_price__gte=18000) | Q(year_price_data__max_price__lte = 20000,year_price_data__max_price__gte=18000)) 

그 때문에의 문제 또는 2012의 행을 반환 아무것도 돌려 보내지 마!

그럼 내 질문은 : 어떻게 모든 manytomany 행에 대해서만 OR 쿼리를 만들 수 있습니다, 그래서 쿼리가 정확할까요?

+0

내가 잘못 이해할 수 있지만 ... AND 쿼리를 원하지 않습니까? 예 : 2014 년에 판매되었으며 18,000 달러 이상이고 20,000 달러 미만입니까? – rnevius

+0

@mevius 우리는 여기서 데이터 자체와 쿼리 모두에서 범위를 다루고 있습니다. 그래서 이해합니다. 쿼리 범위가 쿼리 범위가 자동차 범위 내에 있음을 확인하는 데 필요합니다.) – YardenST

답변

2

첫째, 여기 왜 ManyToMany 관계가 필요한지는 알 수 없습니다. 자동차는 많은 연간 가격 인스턴스를 가질 수 있지만 각 연간 가격은 한 대의 자동차에만 적용됩니다. 따라서 적절한 관계는 YearPriceData에서 Car에 이르는 ForeignKey입니다.

어쨌든 spanning multi-valued relationships의 설명서를 읽어야합니다. 위에서 설명한대로 두 조건을 모두 같은 엔터티에 적용하려면 동일한 필터 호출에서 두 조건을 적용해야합니다. 이게 작동해야합니다 :

Car.objects.filter(year_price_data__year=2014, Q(year_price_data__min_price__lte=20000,year_price_data__min_price__gte=18000) | Q(year_price_data__max_price__lte = 20000,year_price_data__max_price__gte=18000)) 
+0

감사합니다. Ill 테스트 이 곧. ManyToMany rel : 당신은 절대적으로 일반적입니다. 그러나 이것은 단지 예일뿐입니다. YearPriceData는 정적입니다 (값이 때때로 변경되는 100 개의 행). 각 자동차는이 테이블의 일부 행과 관련됩니다. – YardenST

+0

가 작동합니다. 고마워요. – YardenST