2012-07-23 2 views
1

장바구니에서 filter 검색어를 range (으)로 실행 중입니다. 난 filter 항상 기본 키에 의해 그룹화 된 queryset을 반환 생각,하지만 그렇지 않아 보인다. 간단한 Django 필터 쿼리 : group by primary key?

이들은

내 모델입니다 :

class MCode(models.Model): 
    code = models.CharField(max_length=16) 
class Product(models.Model): 
    id = models.CharField(max_length=40, primary_key=True, db_index=True) 
    mcode = models.ForeignKey(MCode, null=True, blank=True, db_index=True) 
class Review(models.Model): 
    review_id = models.CharField(max_length=32, primary_key=True, db_index=True) 
    product = models.ForeignKey(Product, db_index=True) 
    rating = models.IntegerField() 
    time = models.DateTimeField(db_index=True) 

그리고 이것은 내 코드입니다 :

mcode = 'M83' 
base = Product.objects 
tcode_obj = MCode.objects.filter(code=mcode.upper()) 
return base.filter(tcode=tcode_obj, 
        review__time__range=[date_from, date_to]) 
내가 다섯 개 결과를 얻고있다

,하지만 그들 중 세 동일한 기본 키가 있습니다. 내가 이 아닌 각각 review에 대한 결과를 얻는 것 같습니다.

누구나 ID로이 products을 그룹화하고 첨부 된 reviews의 개수로 주석을 달 수 있습니다.

+0

"그룹"이라고 할 때 "정렬"을 말합니까? "그룹화"는 전혀 다른 개념입니다. –

+0

각 리뷰가 아니라 각 제품에 대한 결과를 원합니다. 어쩌면 클라이언트 측에서이 작업을 수행해야하지만, 장고에서는 가능한지 궁금합니다. – flossfan

+0

'.distinct()'시도 했습니까? –

답변

1

Product과 같이 여러 시간과 일치 할 수있는 항목을 기준으로 선택할 경우 일정 시간 동안 Review 초가 걸릴 때마다 일치 항목이 이미있는 항목의 사본 인 경우에도 해당 항목이 쿼리 세트에 추가됩니다. 실제로이 동작을 원할 때도 있지만 쿼리 세트를 고유 항목으로 제한해야하는 경우 쿼리 끝에 .distinct()을 사용하십시오. 중복을 얻는 것은 쿼리에서 논리적 OR을 사용할 때도 일반적이므로이를 수행 할 때주의해야하며 .distinct()을 사용하는 것을 잊지 마십시오.