组团学

高级数据查询

阅读 (243404)

一、Q对象

  • 导入

    from django.db.models import Q

  • 逻辑或

    作为or查询来使用

    def q(req): u = User.objects.filter(Q(age__gt=20)) #这个没有and和or一说 因为就一个条件 u = User.objects.filter(Q(age__gt=20)|Q(sex=True)) #查询age大于20 或 性别为True的 return render(req,'show.html',{'data':u})
  • 逻辑非

    def q(req): # 查询年龄不为20的数据 u = User.objects.filter(~Q(age=20)) u = User.objects.exclude(age=20) return render(req,'show.html',{'data':u})

二、F对象

  • 导入

    from django.db.models import F

  • 作用

    可以使用模型的字段A与字段B进行比较,如果字段A写在了等号左侧,则字段B只能出现在等号右侧,需要通过F类进行构造

  • 需求

    获取男生个数多于女生个数的班级

  • 示例

    def f(req): gs = Grade.objects.filter(gboynum=F("ggirlnum")) print(gs) return HttpResponse('f')
  • F对象支持数学操作

    gs = Grade.objects.filter(gboynum=F("ggirlnum")+35)
  • 可以使用“关联模型类名小写__属性名”进行关联查询

    • 需求

      获取所有班级中学生所在的班级信息

    • 示例

      gs = Grade.objects.filter(isDelete=F("student__isDelete")) print(gs)

三、关联查询

  • 作用

    处理join

  • 语法

    关联模型类名小写__属性名__比较运算符=值

  • 需求

    获取描述中包含lucky的学生所在班级

  • 示例

    gs = Grade.objects.filter(student__sname__contains="lucky") print(gs)

四、原生sql操作

  • 格式

    类名.objects.raw(‘SQL语句’)

  • 示例

    查询所有字段

    def index(req): obj = User.objects.raw('select * from user') for i in obj: print(i.username,i.sex) return HttpResponse('index')

    查询个别字段

    def index(req): obj = User.objects.raw('select id,username,sex from user') for i in obj: print(i.username,i.sex) return HttpResponse('index')

    注意:当查询为某几个字段的时候 则必须包含主键字段 否则报错

    raise InvalidQuery('Raw query must include the primary key')
  • 别名查询

    格式:类名.objects.raw(‘SQL语句’)

    User.objects.raw('''select username as name, age as uage, id FROM user''')

    您可以使用translations参数to 将查询中的字段映射到模型字段 raw()。这是一个字典,将查询中字段的名称映射到模型上字段的名称

    上面的查询也可以写成

    field_map = {'username': 'name', 'age': 'uage'} u = User.objects.raw('SELECT * FROM user', translations=field_map)

五、获取原生SQL语句

  • 说明

    将返回查询集的过滤器转换成原生SQL

  • 属性

    query

  • 实例

    User.objects.all().query
需要 登录 才可以提问哦