减少django项目的QuerySet数量

时间:2015-12-15 10:46:37

标签: python sql django django-queryset

我正在制作一个实体 - 评论 - 投票类型的系统,每个实体都会有一些评论,每个评论都会有一些投票(上/下)

class Entity(models.Model):
    name = models.CharField()
    ...

class Review(models.Model):
    author = models.ForeignKey(user)
    entity = models.ForeignKey(Entity)
    ....

class Vote(models.Model):
    vote_user = models.ForeignKey(user)
    vote_review = models.ForeignKey(Review)
    vote_value = models.BooleanField() # True = Up

对于每个实体,我希望有一个评论列表,注释每个评论的upvotes和downvotes的数量。

到目前为止,我的方法是为每次审核运行2个额外查询:

count_up = Vote.objects.filter(vote_review__id = X, vote_value = True)
count_down = Vote.objects.filter(vote_review__id = X, vote_value = False)

这会返回正确的结果。但是,查询的数量似乎效率很低。

我是否知道是否有更好的方法来构建查询?或者如何更改架构以更好地支持这种操作?

由于

1 个答案:

答案 0 :(得分:1)

如果您想要的只是计数,那么您应该只使用count

  

返回一个整数,表示与QuerySet匹配的数据库中的对象数。 count()方法永远不会引发异常。

count_up = Vote.objects.filter(vote_review__id = X, vote_value = True).Count()
count_down = Vote.objects.filter(vote_review__id = X, vote_value = False).Count()

这将修改查询,只返回查询创建的对象数,并停止花费时间返回模型。