django动态条件查询Q对象


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>]

实例二:
# 通过字典过滤,显得逼格高点
  filter_dict = dict()
  filter_dict['status'] = True
  filter_dict['node_port__gt'] = '0'

  if self.request.GET.get('search_pk'):
       search_pk = self.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
       return App.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 = Person.objects.filter(**kwargs)

猜你喜欢

转载自blog.csdn.net/weixin_42322206/article/details/103483676