2012-07-23 66 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()