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')