阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

高级数据查询

94次阅读
没有评论

共计 1549 个字符,预计需要花费 4 分钟才能阅读完成。

一、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

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-05-26发表,共计1549字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中