代码之家  ›  专栏  ›  技术社区  ›  DeltaG

Django-惰性查询和效率

  •  1
  • DeltaG  · 技术社区  · 7 年前

    section_list_active = Section.objects.all().filter(course=this_course,Active=True,filter(teacher__in=[this_teacher]).order_by('pk')
    if section_list_active.count() > 0:
        active_section_id = section_list_active.first().pk
    else:
        section_list = Section.objects.all().filter(course=this_course).filter(teacher__in=[this_teacher]).order_by('pk')
        active_section_id = section_list.first().pk
    

    我知道查询集在被使用之前是不会被评估的 .first().pk 比特?),那么就没有更快的方法了吗?如果他们不偷懒,我可以点击整个部分列表的DB,然后过滤那些设置了属性的部分 Active ,但我不知道如何才能做到这一点,而不击中它两次(假设我必须去 else ).

    1 回复  |  直到 7 年前
        1
  •  0
  •   willeM_ Van Onsem    7 年前

    如果你只对 Section (或相应的 pk 是的 Active 领域 第一:

    active_section_id = Section.objects.filter(
        course=this_course,
        teacher=this_teacher
    ).order_by('-Active', 'pk').first().pk

    或者更优雅一点:

    active_section_id = Section.objects.filter(
        course=this_course,
        teacher=this_teacher
    ).earliest('-Active', 'pk').pk

    活跃的 按降序排列,如果有一行 Active=True ,则此项将在顶部排序。下一步我们将 .first() 对象,并可以选择 .

    万一没有 满足过滤条件,然后 .earliest() 会回来的 None ,这将导致 AttributeError 主键 属性。

    注意 小写字母 ,所以 active 而不是 活跃的