2012-07-23 41 views
1

我在Django用range運行filter查詢。我認爲filter總是返回一個按主鍵組成的查詢集,但似乎沒有。簡單的Django過濾器查詢:按主鍵組?

這是我的模型:

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的結果,而不是每個product

有誰知道我怎麼可以用ID將這些products分組,並用附加的reviews的計數進行標註?

+0

當你說「羣」,你的意思是「排序」? 「Group by」是一個完全不同的概念。 – 2012-07-23 16:09:43

+0

我只是想要每個產品的結果,而不是每個評論。也許我應該在客戶端做到這一點,但我想知道是否可以用Django。 – flossfan 2012-07-23 16:10:25

+0

試過'.distinct()'? – 2012-07-23 16:17:15

回答

1

當您根據可能匹配多次的內容(如ProductReview s)進行選擇時,每個匹配都會添加到查詢集中,即使它與已存在的項目重複。實際上有些時候您可能需要這種行爲,但是如果您需要將查詢集限制爲唯一項目,請在查詢結束時使用.distinct()。在您的查詢中使用邏輯OR時,獲取重複數據也很常見,因此請注意您這樣做的時間,並記得在那裏使用.distinct()