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