0

例如我有这样的代码

class Product(models.Model):
    ...
    @property
    def review_count(self):
        return Review.objects.filter(order__product_id=self.id, published=True).count

class Order(models.Model):
    product = models.ForeignKey(Product)

class Review(models.Model):
    order = models.ForeignKey(Order)
    published = models.BooleanField(default=False)

而且我经常需要显示每个产品的评论数量。我找到了方法-

  1. 属性review_count - 看起来不错,但在 Product 对象集上它非常慢。
  2. 使用 .extra 方法进行注释 - 它更快,但需要额外的 SQL(我认为,我不能简单地使用注释,因为已发布 = True 对评论对象进行过滤)。

我认为,如果我在评论模型中使用 fk 附加字段“产品”,我将可以轻松快捷地获得一组产品,但在这种情况下,字段“产品”将依赖于字段“订单”,而不是我认为有利于标准化。

PS:一个订单可能很少有评论 - 没关系。以及与评论相关的订单,以检查一个订单没有太多评论 - 审核问题。

请帮帮我,我该如何改进这个方案,以便更快、更轻松地获得产品的评论次数

4

1 回答 1

1

我不知道你为什么说你不能使用该annotate()方法,因为你需要过滤。这不仅受支持,而且在文档中明确描述

Product.objects.filter(order__review__is_published=True).annotate(Count('order__review'))
于 2013-09-05T17:29:06.853 回答