Django运算表达式与Q对象/F对象(2)

Q对象可以使用&(and)、|(or)操作符组合起来
studentList = Student.objects.filter(Q(pk__lt = 3)|Q(sage__gt=50))  pk_id小于3或年龄大于50岁
models.User.objects.filter(Q(username='老王') & Q(userpass='admin'))  条件与组合
models.User.objects.filter(~Q(username='老王'))  条件非表示取反
可以使用 &(and) |(or)  ~(not) 结合括号进行分组,构造更复杂的Q对象
filter函数可以传递一个或多个Q对象作为位置参数,如果有多个Q对象,这些参数的逻辑为and

下面分享一个综合用法:

def get(self, request, *args, **kwargs):
        filters = request.GET
        #找出符合customer的数据转成列表
        Qs = [Q(customer=request.user.customer)]
        try:
            if 'limit' in filters:
                limit = abs(int(filters['limit']))
                if limit > 50:
                    limit = 50
            else:
                limit = 15
            start_id = int(filters.get('start_id', 0))
            #添加符合start_id的对象
            Qs.append(Q(id__gt=start_id))
            #添加符合状态的state
            if 'state' in filters:
                Qs.append(Q(state__in=filters['state']))
            else:
                Qs.append(Q(state__in=[0, 1, 2, 3, 4]))
            #添加符合title的数据
            if 'title' in filters:
                Qs.append(Q(title__contains=filters['title']))
        except Exception:
            return params_error({"filters": "过滤参数不合法"})
       
        #通过*Qs,对列表数据同时满足上述情况的数据进行总的帅选,并设置限制集
        sets = Questionnaire.objects.filter(*Qs)[:limit]

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/dc9f9182edca034f70f420a4e6086bb9.html