【问题标题】:Combine Queries in Django在 Django 中组合查询
【发布时间】:2012-03-01 01:35:47
【问题描述】:

我正在进行一系列查询以获取查询集的过滤变体。有没有一种更简单的方法可以做到这一点,我不打 DB 6 次,而是只使用初始调用?

data['os']['today'] = Page.objects.all()
data['os']['pro'] = Page.objects.filter(premium_plan=PlanType.PRO).count()
data['os']['yesterday'] = Page.objects.filter(created__lt=within_last_day).count()
data['os']['week'] = Page.objects.filter(created__lt=within_last_week).count()
data['os']['new_pro'] = Page.objects.filter(upgrade__cancelled_date__isnull=True, upgrade__activated_date=within_last_day)
data['os']['new_top_pages'] = Page.objects.filter(created__gt=within_last_day).extra(select={'total_fans':'facebook_count + twitter_count'}, order_by=('-total_fans',))[:10]

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    如果您正在获取所有页面:

    pages = Page.objects.all() # Page.objects.select_related() if we want filtering on related objects fields
    

    然后你可以在不额外的数据库查询的情况下获取其他类型的页面:

    # it will not call the database
    data['os']['yesterday'] = pages.filter(created__lt=within_last_day).count()
    data['os']['week'] = pages.filter(created__lt=within_last_week).count()
    ...
    

    如果通过 filter 方法获取页面,后续调用 filter 将使用第一个 fetching set:

    pages = Page.objects.filter(id__in=(1,2,3))  # we have pages in db with ids in 1,2,3,4,5
    pages_additional = pages.filter(condition) #Here we are working with objects with ids 1,2,3
    

    如果一开始你没有获取所有的记录(Page.objects.all()),那么如果没有任何额外的查询,就不可能获得不包含在第一个获取集中的额外数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 2021-05-29
      • 2022-01-14
      • 2018-08-20
      • 2019-02-11
      • 2012-12-20
      相关资源
      最近更新 更多