简单的Django过滤查询:按主键分组?

时间:2012-07-23 16:00:48

标签: django django-models django-piston

我在Django中使用filter运行range查询。我以为filter总是返回一个按主键分组的查询集,但似乎没有。

这些是我的模特:

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的计数进行注释?

1 个答案:

答案 0 :(得分:1)

当您根据可能多次匹配的内容进行选择时,例如ProductReview s在一段时间内,每个匹配都会添加到查询集中,即使它是重复的项目已经存在。实际上您可能会想要这种行为,但如果您需要将查询集限制为唯一项,请在查询结束时使用.distinct()。在查询中使用逻辑OR时,获取重复项也很常见,因此请注意您执行此操作的时间并记得在那里使用.distinct()