0047 Q函数的使用

  Django的组合查询,一般使用Q函数。

1 引用Q函数

from django.db.models import Q

2 支持& (and)、| (or)、~(not)操作符

Asset.objects.get(
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
    question__startswith='Who'
)
Asset.objects.get(
    Q(pub_date=date(2005, 5, 2)) | ~Q(pub_date=date(2005, 5, 6)),
    question__startswith='Who'
)
Asset.objects.get(
    Q(pub_date=date(2005, 5, 2)) & Q(pub_date=date(2005, 5, 6)),
    question__startswith='Who'
)

3 复杂分级条件

join_orgs = models.UserOrg.objects.filter(Q(user=user), ~Q(active=2) & ~Q(active=9))  # 得到已经加入过的组织
q1 = ~Q()  # 我加入的组织不包括在内
q1.connector = 'OR'
for item in join_orgs:
    q1.children.append(('id', item.org.id))
q2 = Q()  # 所有未注销的组织
q2.connector = 'AND'
q2.children.append(('active', 1))

q = Q()  # 所有未注销的组织中,除了我加入的组织,其余全部列出
q.connector = 'AND',
q.add(q1, 'AND')
q.add(q2, 'AND')
org_objs = models.Organization.objects.filter(q) 
q1 = Q()
q1.connector = 'OR'
q1.children.append(('authority_manager_id',27))
q1.children.append(('authority_manager_id',23))
q1.children.append(('authority_manager_id',24))
q1.children.append(('authority_manager_id',25))
q1.children.append(('authority_manager_id',16))
q1.children.append(('authority_manager_id',26))
q1.children.append(('authority_manager_id',18))
q1.children.append(('authority_manager_id',19))
q1.children.append(('authority_manager_id',20))
q1.children.append(('authority_manager_id',21))
q1.children.append(('authority_manager_id',22))
q2 = ~Q()
q2.connector = 'AND'
q2.children.append(('granted',0))
q3 = Q()
q3.connector = 'AND'
q3.children.append(('role_id',role_id))
q = Q()
q.connector='AND'
q.add(q1,'AND')
q.add(q2,'AND')
q.add(q3,'AND')

  

原文地址:https://www.cnblogs.com/dorian/p/12432869.html