缩短对象之间关系链的方法

时间:2013-09-05 08:36:54

标签: django django-models foreign-key-relationship

例如我有这样的代码

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. property review_count - 它看起来不错,但在一组Product对象上它很慢。
  2. 使用.extra方法注释 - 它更快,但需要额外的SQL(我认为,我不能简单地使用注释,因为通过published = True过滤审阅对象)。
  3. 我认为,如果我有额外的'产品'与fk到产品评论模型,我将可以轻松,快速地获得产品集,但在这种情况下,字段'产品'将取决于字段'订单' ,我觉得,这对正常化不利。

    P.S。:一个订单可能有几个评论 - 没关系。和审查相关的订单检查一个订单没有太多审查 - 审核问题。

    请帮助我,如何改进此计划,以便更快,更轻松地对产品进行审核

1 个答案:

答案 0 :(得分:1)

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

Product.objects.filter(order__review__is_published=True).annotate(Count('order__review'))