1、固定条件的或查询
User.objects.filter(Q(is_staff=True) | Q(username__contains='123'))
[<User: staff_a>, <User: 123>, <User: staff_b>]
2、动态可变条件查询
# di = {'username__contains': '123', 'is_staff': True} # 条件不固定
di = {'username': '123', 'age': 18, 'is_staff': True} # 条件不固定
q = Q()
for i in di:
q.add(Q(**{i: di[i]}), Q.OR) #And
# <django.db.models.query_utils.Q object at 0x103a84bd0>
# <django.db.models.query_utils.Q object at 0x103af1110>
print q
# (OR: (AND: ), (AND: ('username', '123')), ('is_staff', True))
User.objects.filter(q)
# [<User: staff_a>, <User: 123>, <User: staff_b>]
3、实例
# 通过字典过滤
filter_dict = dict()
filter_dict['status'] = True
filter_dict['node_port__gt'] = '0'
search_pk = request.GET.get('search_pk')
query_1 = Q(status=True)
query_2 = Q(name__icontains=search_pk)
query_2 = query_2 | Q(node_port__icontains=search_pk)
query = query_1 & query_2
User.objects.filter(**filter_dict).filter(query)
kwargs = {}
if A is not None:
kwargs['name__startWith'] = A
if B is not None:
kwargs['address__contains'] = B
if C is not None:
kwargs['mobile__endWith'] = C
personList = User.objects.filter(**kwargs)