Django框架提升(1)~模型

--------模型models-------

模型 - Django对各种数据库都提供了很好的支持
        Django为这些数据库提供了统一的API(接口),可以根据不同的业务需求选择不同的数据库
  • 配置数据库

      在__init__.py文件中添加
           import pymysql
           pymysql.install_as_MySQLdb()
      修改settings.py :
          DATABASES
    
  • 开发流程

      1.配置数据库
      2.定义模型类 一个模型类都在数据库中一个表
      3.生成迁移文件
      4.执行迁移文件,生成数据表
      5.使用模型类进行对数据库的增删改查(crud)操作
    
  • ORM

      概述:对象(O),关系(R),映射(M)
          任务: 根据对象的数据类型生成表结构
                 将对象的列表的操作转换为SQL语句
                 将SQL语句查询到的结果转换为对象、列表
          优点:极大减轻了开发人员的工作量,而且面对一种操作因数据库的变	更而重写代码
    
  • 定义模型

       模型、属性、表、字段间的关系:
          一个模型类在数据库中对应一张表,在模型中定义的属性,对应该模型对照的一个字段
    
    • 定义属性

        概述:django根据属性的类型确定以下信息
                -当前选择的数据库支持字段的类型
                -渲染管理表单时使用默认的html控件
                -在站点管理最低限度的验证
      
                -jiango 会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项
                设置某属性为主键列后,则django不会在生成默认的主键列
      
                -属性命名限制:遵循标识符规则,不能是Python的保留关键字、由于django的查询方式,不允许使用连续的
                下划线
        库:
               -定义属性时,需要字段类型,字段类型被定义在django.db.models.fields目录下
                为了方便使用,被导入到django.db.models中
      
        使用方式
                导入from django.db import models
                通过models.fields创建字段类型对象,赋值给属性
      
        逻辑删除
            -对于重要的数据都做逻辑删除,不做物理删除,实现方法时定义isDelete属性,
            类型为BooleanField,默认值为False
      
        字段类型
            AutoField():一个根据实际ID自动增长的IntegerField,通常不指定,如果不指定
                一个主键字段将自动添加到模型中
            CharField(max_lengh=字符串长度):字符串,默认的站点表单样式时Textinput
            TextField():大文本字段,一般超过4000使用,默认的站点表单控件时textarea(文本域)
            IntegerFeild():”整数“
            DecimalField(max_digits=None(位数总数),decimal_places(小数点后的位数)=None):使用python的Decimal示例
                表示的十进制“浮点数”
            FloatField():用python的float示例来表示浮点数
            BooleanField():True/False字段,此字段的默认站点表单控制时checkboxinput
            NullBooleanField:支持null,true,false三种值
            DateField([auto_now=False,auto_now_add=False]):使用python的datetime.date示例表示的日期
                auto_now=True:每次保存对象时,自动设置该字段为当前时间,用于”最后一次修改“的时间戳
                它总是使用当前日期,默认时false
                auto_now_add=True:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,,
                他总是使用当前日期,默认为false
                说明:该字段默认对应的表单控件是一个Textinput,在管理员站点添加了
                    一个javascript写的日历控件,和一个today的快捷按钮,包含了一个额外的
                    invalid_date错误消息键
                注意:auto_now_add,auto_now,and default 这些设置时相互排斥的,他们之间
                    的任何组合将发生错误结果
            TimeField():使用python的datetime.time示例表示的时间,参数时DateField
      
            DateTimeField():使用python的datetime,datetime示例表示日期和时间,
                参数同DateField
            FileField() :一个上传的文件的字段
            ImageField() : 继承了FileDield的所有属性和方法,但是对上传的对象进行校验,
                确保它是一个有效的image
      
        字段选项:
            概述:通过字段选项,可以实现对字段的约束,在字段对象时通过关键参数指定
            null:如果为True,django 将空值一null存储到数据库中,默认是False
            blank:如果为True,则该字段允许为空,默认是false
            注意:null时数据库范畴中的概念,blank时表单验证范畴的
            db_column :字段的名称,如果未指定,则使用属性的名称
            db_index : 若值为true ,则在表中会为此字段创建索引
            default:默认值
            primary_key:若为true,则该字段会称为模型的主键字段
            unique:如果为true ,这个字段在表中必须有唯一值
      
      
        关系:
            分类:
                ForeignKey 一对多,将该字段定义在多的一端中
                ManyToManyField:多对多,将字段定义在两端中(最好不写)
                OneToOneFeild:一对一,将字段定义在任意一端中(基本不用)
            用一访问多:
                格式:
                    对象.模型类小写_set
                示例:
                    grade.student_set
            用一访问一:(基本不用)
                格式:
                    对象.模型类小写
                示例:
                    grade.student
            访问id:
                格式:
                    对象.属性_id
                示例:
                    student.sgrade_id
      
  • 创建模型类

    • 元选项 :

            在模型类中定义Meta类,用于设置元信息
                db_table=""  :定义数据表名,推荐使用小写字母,如果不写,数据表名默认为项目名小写_类名小写
                ordering=[] :对象的默认排序字段,获取对象的列表时可以使用
                                示例:ordering=['id'] 升序 、 ordering=['-id'] 降序
      
                注意:排序会增加数据库的开销(消耗资源)
      
  • 模型成员

       -类属性:
              objects:-自己创建的属性 和 系统隐藏属性:objects他是Manager类型的一个对象,作用时与数据库进行交互
                       -当定义的模型类没有指定管理器,django为模型创建一个objects的管理器
    
          自定义管理器:当为模型指定模型管理器,django就不在为模型类生成objects模型管理器了
                  stuObj = models.Manager()  #stuObj就是自定义模型管理器,此时objects不存在了
    
          自定义模型管理器Manager()类
              模型管理器是django模型与数据库进行交互的接口,一个模型可以有多个模型管理器
              作用:
                  1.向管理器类中添加额外的方法
                  2.修改管理器返回的"原始查询集"(没有任何过滤的数据库所有数据)
                      重写get_queryset()方法
          ------------------------------------------------------------------------------
                  class StudentsManger(models.Manager):
    
                        #自定义模型管理器(重写原始查询集)
                      def get_queryset(self):
                          return super(StudentsManger,self).get_queryset().filter(isDelete=False)
    
                  class Students(models.Model):
    
                      #构建自定义管理器,使用修改后的查询集
                      stuObj = StudentsManger()
          -----------------------------------------------------------------------------
    
      -创建对象:
          目的:向数据库中添加数据当创建对象时,django不会对数据库进行读写操作,当调用save()时候才与数据库进行交互,
              将对象保存到数据库表中
          注意:__init__方法已经在父类models.Model中使用,在自定义的模型中无法使用
          方法:
                  -1、在模型类中增加一个类方法
                  ----------------------------------------------------------------------------
                  models.py:
                      @classmethod
                      def createStudent(cls,name,age,gender,contend,grade,lastT,createT,isD=False):
                          #创建对象
                          stu = cls(sname=name,sage=age,sgender=gender,scontend=contend,lastTime=lastT,createTiem=createT,
                                      isDelete=isD,sgrade=grade)
                          #返回对象
                          return stu
    
                  views.py:
                      def addstudent(request):
                          grade = Grades.objects.get(pk=1)
                          #向models.py中的addStudent()传递参数
                          stu = Students.createStudent("刘德华",34,True,"我是刘德华",grade,"2020-4-10","2020-4-15")
                          stu.save()
                          return HttpResponse("dsad")
    
                  -2、在自定义管理器中添加方法
                  -------------------------------------------------------------
                  models.py:
                      class StudentsManger(models.Manager):
    
                          #自定义模型管理器(重写原始查询集)
                          def get_queryset(self):
                              return super().get_queryset().filter(isDelete=False)
    
                      #创建对象第二种方式:
                          def creatStudent(self,name,age,gender,contend,grade,lastT,createT,isD=False):
                              stu = self.model()
                              # print(type(grade))
                              stu.sname=name
                              stu.sage=age
                              stu.sgender=gender
                              stu.scontend=contend
                              stu.sgrade=grade
                              stu.lastTime=lastT
                              stu.createTiem=createT
                              return stu
                  views.py:
                          def addstudent2(request):
                              grade = Grades.objects.get(pk=1)
                              stu = Students.stuObj.creatStudent("张学友",31,True,"我是张学友",grade,"2020-4-10","2020-4-15")
                              stu.save()
                              return HttpResponse("bbb")
    
      模型查询:
          概述:
              1.查询表示从数据库获取的对象的集合(原始查询集)
              2.查询集可以有多个过滤器
              3.过滤器就是一个函数,基于所给的参数限制查询集结果
              4.从sql角度说:查询集和select语句等价,而过滤器就想where条件语句
    
          查询集:
              概念:
              1.在管理器上调用过滤器方法返回查询集
              2.查询集经过过滤器筛选后返回新的查询集,所以说可以写成链式调用
              3.惰性执行:创建查询集不会带来任何的数据访问,直到调用数据时,才会访问数据
              4.直接访问数据的情况:1,迭代 2.序列化 3.与if合用
              5.返回查询集的方法称为”过滤器“
                  -all()返回查询集中的所有数据
                  -filter(key=value) 保留符合条件的数据
                      filter(key=value,key=value) 两个条件时"且"的关系即and
                      filter(key=value).filter(key=value) 链式
                  -exclude() 过滤掉符合条件的数据
                  -order_by() 排序
                  -values() 一条数据就是一个一个对象(字典),返回一个列表[{....},{}]
              6.返回单条数据:
                  get()  返回一个满足条件的对象
                      注意:1.如果没有找到符合条件的对象,会引发"模型类.DoesNotExists"异常
                              2.如果找到多条对象,也会引发"模型类.MultipleObjectsReturned"异常
                  count() 返回当前查询集中的对象个数
                  first() 返回当前查询集中的第一个对象
                  last()返回当前查询集中的最后一个对象
                  exists() 判读查询集中是否有数据,有True,反之false
    
              7.限制查询集
                  查询集返回列表,可以使用下标的方法进行限制(切片),等同于sql中的Limit语句
                  注意:下标不能时负数
    
              8.查询集的缓存(高速缓存)
                  概述:每个查询集都包含一个缓存,来最小化的对数据库的访问
                      在新建的查询集中缓存,首次为空,第一次对查询集求值,会发生数据缓存,
                      django会将查询出来的数据进行缓存,并返回查询结果,以后的查询直接使用查询集合的缓存
    
    
              9.字段查询
                  概述:
                      实现了Sql 中的where语句,作为fiter(),exclude(), get()的参数
                      语法:属性名称__比较运算符=值   注意:两个下划线
                      外键:属性名_id
                      转义:sql中like语句中使用%时为了匹配展位,匹配数据中的%(where like '%')
    
    
    
    
                  比较运算符:
                      1.判断,区分大小写
                          filter(isDelete=Flase)
                      2.contains 是否包含,区分大小写 像sql中的like
                          studentsList = Students.stuObj.filter(sname__contains="l")
                      3.startswith、endswith 以value开头或结尾,区分大小写
                          studentsList = Students.stuObj.filter(sname__startswith="l")
                      注意:以上四个在前面加上i,就表示不区分大小写:icontains
                      4.isnull , isnotnull 是否为空
                          filter(sname__isnull=False)
                      5.in 是否包含在范围内
                          studentsList = Students.stuObj.filter(pk__in=[1,3,4])
                      6.gt   gte   lt   lte   大于  大于等于  小于   小于等于
                          studentsList = Students.stuObj.filter(sage__gt=30)
                      7.year   month  day  week_day   hour   minute  second
                          studentsList = Students.stuObj.filter(createTiem__year=2020)
                      8.跨关联查询
                          处理类似sql中innner join ,
                          语法:模型类名小写__属性名__比较运算符
                          grade = Grades.objects.filter(students__scontend__contains="我是刘德华")
                      9.查询快捷
                          pk  代表主键
    
                  聚合函数
                      使用aggregrate()函数返回聚合函数的值
                      导入包:
                          from django.db.models import Max,Count
                      Avg
                      Count
                      Max
                          maxAge=Students.stuObj.aggregate(Max('sage'))
                      Min
                      Sum
                  F对象:(两个属性之间的比较)
                      导入包:
                          from django.db.models import F,Q
                      可以使用模型A属性和B属性进行比较
                          g=Grades.objects.filter(ggirlnum__gt=F('gboynum'))#女生人数大于男生人数的班级
                      支持F对象的算数运算
                          g=Grades.objects.filter(ggirlnum__gt=F('gboynum')+20)
                  Q对象:(解决属性间"或","非")
                      概述:过滤器的方法中的关键字参数,条件为And模式
                      or查询:
                          stu=Students.stuObj.filter(Q(pk__lt=3)|Q(sage__gt=30))
                      取反:
                          stu=Students.stuObj.filter(~Q(pk__lt=3))
    
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 学习 Django 框架可以先了解 Python 编程语言,然后学习 Django 的基本概念和架构,掌握 Django模型、视图、模板等组件的使用方法,同时可以通过实践项目来深入理解 Django 的应用。可以参考 Django 官方文档、教程和相关书籍,也可以参线上或线下的培训课程。 ### 回答2: 学习Django框架需要以下几个步骤。 首先,掌握Python语言的基本知识。Django是用Python编写的,因此在学习Django之前,需要对Python语言有一定的了解,包括基本的语法、数据类型和函数等。 其次,了解Django的基本概念和架构。Django是一个基于MVC模式的Web框架,理解其基本概念和架构可以帮助我们更好地使用和开发Django应用程序。 然后,阅读官方文档并进行实践。Django官方网站提供了详细的文档和教程,包括教程和指南,这些资源可以帮助我们理解和使用Django框架。通过按照教程步骤一步一步地实践,可以更好地掌握Django的使用。 此外,参与社区活动和交流也是学习Django的好方法。Django拥有活跃的社区,可以在社区论坛、邮件列表等平台与其他开发者交流和分享经验。 最后,通过实际项目的开发来深入学习和掌握Django。通过实践,可以更好地理解Django的各个功能和特性,并且在实际项目中解决实际问题。 总之,学习Django需要掌握Python语言基础,了解Django的基本概念和架构,阅读官方文档并进行实践,参与社区交流,以及通过实际项目来巩固学习。不断地学习和实践,可以逐步提高自己在Django框架下的开发能力。 ### 回答3: 学习Django框架可以按照以下步骤进行: 1. 学习PythonDjango是使用Python编写的,所以首先要掌握Python基础知识,包括语法、数据类型、函数、模块等。 2. 学习Web开发基础知识:了解HTTP协议、HTML、CSS、JavaScript等前端基础知识,以及数据库操作等后端知识。 3. 学习Django官方文档:Django官方文档提供了详细的教程、示例和API文档,可以系统地学习框架的各个方面。 4. 进行实践项目:通过实际项目来应用所学的知识,可以做一个简单的博客、论坛或电商网站等,深入理解Django框架的使用方式和特性。 5. 参与社区和论坛:参与Django社区和相关论坛的讨论和交流,与其他开发者分享经验和解决问题,可以拓宽自己的视野和深对Django的理解。 6. 阅读优秀的开源项目:阅读和分析一些优秀的开源项目,如Django的源码、Django REST framework等,可以学习到一些实践经验和优秀的编码风格。 7. 持续学习和实践:Django框架不断更新迭代,持续学习新的功能和特性,不断实践和尝试新的项目,保持对Django的研究和掌握。 总的来说,学习Django需要掌握Python基础、Web开发知识以及对Django官方文档的深入理解。通过实践项目、参与社区和论坛、阅读源码等方式可以不断提升自己的Django技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值