Django查询集的`count`调用有多贵?

时间:2016-02-25 04:03:04

标签: django database django-models django-orm

我有一个"帖子列表"我必须渲染。对于每个帖子,我必须做三个过滤器查询集,或者它们在一起,然后计算对象的数量。这合理吗?哪些因素可能会导致这种缓慢?

这大致是我的代码:

1. Java EE deployment descriptor
2. Runtime deployment descriptor

2 个答案:

答案 0 :(得分:0)

我能看到的最大因素是你对每个帖子都有过滤操作。如果可能,您应该在一个查询中查询与每个帖子关联的结果。从count开始,它是从查询中获取结果数量的最有效方式,因此它可能不是问题。

答案 1 :(得分:-1)

请尝试以下代码:

def viewable_posts(request, post):

    private_posts = post.replies.filter(permissions=Post.PRIVATE, author_profile=request.user.user_profile).values_list('id',flat=True)
    community_posts = post.replies.filter(permissions=Post.COMMUNITY, author_profile__in=request.user.user_profile.following.values_list('id',flat=True)
    public_posts = post.replies.filter(permissions=Post.PUBLIC).values_list('id',flat=True)

   Lposts_id = private_posts
   Lposts_id.extend(community_posts)
   Lposts_id.extend(public_posts)

   viewable_posts  = post.filter(id__in=Lposts_id).order_by('-modified_date')
   viewable_posts_count  = post.filter(id__in=Lposts_id).count()

   return viewable_posts,viewable_posts_count

它应该改进以下内容:

  1. order_by一次,而不是三次
  2. count方法在仅包含索引字段
  3. 的查询上运行
  4. django使用带有"值"的更快过滤器,用于计数和过滤。
  5. 取决于您的数据库,db自己的缓存可以选择最后查询的viewable_posts帖子,并将其用于viewable_posts_count
  6. 实际上,如果您可以将前三个过滤查询压缩为一个,那么您也可以节省时间。