Django学习笔记——View与Model交互

View与Model交互

——即业务代码与数据库交互

在这里采用的是ORM语句,而不是常规的SQL语句
在对应的views中的方法中书写ORM语句

查询

  • 所有查询 all()
    booklist = BookInf.objects.all()

  • 精确查询 get()
    book = BookInf.objects.get(id=1)
    get查询得到的结果是一个对象
    可以对其属性等操作

  • 模糊查询 filter()
    所有查询属性后面跟的都是双下划线
    查询到的结果是对象的集合

    • 全等于 exact
      list = BookInfo.onjects.filter(btitle__exact = 'aaa')
      exact区分大小写,iexact忽略大小写
    • 首字符 startswith
      尾字符 endswith
      包含字符 contains

      list = BookInfo.onjects.filter(btitle__startswith = 'K')
      以上三个都是区分大小写的,在函数前加i就是忽略大小写
      例如:icontains
    • 是否为空 isnull / isnotnull
      list = BookInfo.onjects.filter(btitle__isnull = False)
    • 范围内 in
      list = BookInfo.objects.filter(id__in=[1,3,5])
    • 大于 gt
      小于 lt
      大于等于 gte
      小于等于 lte

      list = BookInfo.objects.filter(id__gt=3)
    • 不等于 excute()
      list = BookInfo.objects.filter().excute(id=3)
    • year 日期字段的年份
      month 日期字段的月份
      day 日期字段的日

      list = BookInfo.objects.filter(data__day=13)
    • Q对象,F对象
      使用Q对象和F对象首先要导入
      from django.db.modles import Q,F
      • Q对象
        Q对象针对的是多条件查询的时候
        所以使用Q对象的时候回配合 与&、或| 两种逻辑运算符使用
        user_list = UserInfo.object.filter(Q(username__contains='zhang')|Q(username__contains='张'))
        user_list = UserInfo.object.filter(Q(username__contains='zhang')&Q(age__gt=18))
        
      • F对象
        F对象针对的是字段间比较查询的时候
        所以F对象经常配合 比较运算符 一起使用
        user_list  = UserInfo.object.filter(phone=F('telphone'))
        
        F对象还可以跨模型类比较字段
        user_list  = UserInfo.object.filter(age__gt=F('UserInfo1__age'))
        
        F对象还可以使用算术运算
        teacher_list  = TeacherInfo.object.filter(age__gt=F('StudentInfo__age') * 2)
        
  • 聚合函数查询

    • 最大 max()
      最小 min()
      平均数 avg()
      和 sun()
      数量 count()

      num = list.count()
    • 还有一种使用aggregate()函数配合聚合函数的使用方法
      不过使用这个方法的话要先导入使用的聚合函数
      from django.db.models import Max
      max = list.aggregate(Max('age'))
      
      还要注意的是这里的聚合函数首字母是大写
  • 外键
    使用外键查询的时候我们首先要明确的有几点

    • 外键没有设错,当一对多时,在多的字段里面设置外键

    • 我们在model中设置约束的时候没有设置id,但是id会自动设置,而外键绑定的就是它自动设置的id

    • balabalabala
      下面我们用实例来介绍
      假设我们查询张老师的所有学生的信息

      #首先我们需要拿到张老师这个对象
      teacher_obj = TeacherInfo.objects.get(name = '张')
      #接下来就可以直接使用外键查询
      studentinfo_list = teacher_obj.studentinfo_set.all() 
      

      是不是不理解studentinfo_set是怎么来的
      我们可以猜到studentinfo是我们设了外键的那张表,
      但是为什么不是大驼峰命名了?后面跟的_set又是什么?
      感谢网上的大佬为我们解释这一切

      反向查找:(基于不存在外键值表的查找为反向查找,前提是两张表已经建立了关系)
      Django默认在外键的表里会埋藏一个字段为studentinfo。
      可以get一个表中不存在的值,通过返回的报错黄页里面可以查看到。
      teacher_boj.studentinfo_set 特殊,代表的是一种能力。
      这个能力就可以获取到这个用户类型下的所有用户或者某几个用户。

      说白了就是因为设外键迁移建表时自动生成的一个隐藏字段
      使用这个特殊字段的特殊能力我们就能反向查询
      这里看到了这个是反向查询,那么什么是正向查询呢

    • 正向查询

       studentinfo_list = StudentInfo.objects.filter(tname__name = '张') 
      

      正向查询就是基于存在外键值表的查找
      这个就比较简单了—— 外键名__另一张表的字段名=‘值’

  • join查询
    又可以成为跨关联关系查询
    其实就是同等于内联接inner join的查询

  • 排序

    • 排序 order_by()
    • 反向排序 reverse()
  • 其他

    • first():返回第一个对象
    • last():返回最后一个对象
    • exists():判断查询集中是否有数据,如果有则返回True

添加

一定要注意进行保存操作save()

#获得对象
book=BookInfo()
#添加对象属性值
book.btitle = 'bbb'
#保存到数据库
book.save()

删除

delete()提交删除到数据库

#获取需要删除的对象
book=BookInfo.objects.get(id = 1)
#将删除操作提交给数据库
book.delete()

修改

一定要注意进行保存操作save()

#获得需要修改的对象
book=BookInfo().objects.get(id = 1)
#修该对象属性值
book.btitle = 'bbb'
#保存到数据库
book.save()

在这里我们介绍的是主要是针对逻辑代码中的与数据库的交互
而我们后端操作数据库的方法还有两种

  • 命令行进入mysql使用sql原生代码操作
  • 命令行进入django使用shell操作
python manage.py shell

进入shell后使用的命令也是ORM语句
但是注意要先导入你要操作模型类

你可能感兴趣的:(Django学习笔记——View与Model交互)