1

filter在 Django 中使用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])

我得到五个结果,但其中三个具有相同的主键。看起来我得到了 each 的结果review,而不是 each product

有谁知道我如何products按 ID 对这些进行分组,并用附件的数量进行注释reviews

4

1 回答 1

1

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

于 2012-07-23T17:14:57.653 回答