django模型1

django支持各类主流的数据库,项目根目录中的db.sqlite就是数据库文件,默认状况下django配置的就是这个文件,它是个文件类型的数据库,比较小
一.数据库的链接配置
    django 链接mysql的配置流程:
     (1) 安装 pymysql:   pip install pymysql
     (2)建立数据库用户   这里须要有建立数据库权限的用户!
        1)可使用navicat管理mysql数据库
        2)通常项目会有数据库人员负责,这里练习咱们使用root帐户进入mysql而后建立一个有建立数据库权限的用户:
            (1)输入命令,首先远程链接SSH,mysql -uroot -pqwe123;进入mysql
            (2)建立新用户:mysql> create user  zx_root   IDENTIFIED by 'xxxxx';   //identified by 会将纯文本密码加密做为散列值存储
                zx_root是用户名,'xxxxx'是密码,用户名和密码能够替换为咱们本身的内容,密码要用引号括起来,
                ****注意mysql语句后面要有;才能结束
            (3)给权限:mysql> grant all on *.*  to zx_root;
            (4)查看用户权限:mysql> show grants for zx_root;
            (5)使受权当即生效:FLUSH PRIVILEGES;

    (3)建立数据库crm
        create database crm;    
    (4) 修改配置
        项目文件夹里的settings下的DATABASES,default里的'ENGINE'(引擎)的值,把backends(后端).后面的sqlite3改为mysql
                                        把  'NAME'的值改成'crm'
                                             增长键值对'USER':'root',      ----若是上面建立好了有建立数据库权限的用户,则输入该用户的名字
                                              增长键值对'PASSWORD':'qwe123',        --------若是使用建立的用户,填入该用户的密码
                                              增长键值对'HOST':'127.0.0.1',
                                              增长键值对'PORT':'3306',    #这里用字符串或者数字均可以,最好字符串
    
    (5)修改项目文件夹(settings.py文件所在的目录)下__init__.py 文件写上:
        import pymysql    #若是环境中新装的pymysql导入不了。close project一下从新进入
            pymysql.install_as_MySQLdb()    #历史缘由,由于python2的时候用的MySQLdb,因此要加这个
    (6)设置时区 仍是在settings.py里 TIME_ZONE = 'Asia/ShangHai' # 北京时间

二.django的ORM系统
    -对象关系映射(Object Relational Mapping,简称ORM)!
    底层仍是执行的SQL,必须经过SQL才能操做数据库,只是写代码这一层看不到
    简单的说就是用面向对象的方式,描述数据库,操做数据库,
    达到不用编写SQL语句就能对数据库进行增删改查。
    映射关系:
    模型类对应数据表,类属性对应表字段名,类的实例对应表中的一条数据
    模型类必须写在app下的models.py文件中,模型若是须要映射到数据库,所在的app必须被安装
    

三.模型的建立与激活
    1.建立模型:(1)teacher这个app文件夹中的models.py中,建立类 class Student(models.Model)    --必须继承models.Model
        Student的模型,表明学生
        (2)建立字段名(类变量,类属性):1)name = models.CharField(max_length=)  
                 ---CharField自己也是一个类,他有一个必备参数max_length,至关于sql中varchar的长度
                           2)age = models.SmallIntegerField(default=0)  
                ---默认值default也能够不给,
                           3)qq = models.CharField(max_length=20,default='')
                ---CharField 最好不要让他None,能够给个空字符串作默认值
                ---通常数据库中qq,电话号码这些用字符串而不是int类型,操做方便
                           4)c_time = models.DateTimeField(verbose_name='建立时间')
                ---建立时间字段,verbose_name参数是提示信息,是给人看的,人类可读的名称
                能够是位置参数,放第一个,也能够是关键字参数
                还能够加一个参数auto_now_add=True,这样就不须要手动输入时间了,django自动帮咱们处理,
                    保存当前对象的时候就会自动填入当前时间
                         5)id 通常省略就好了,不用咱们手动添加,
                    若是模型类中咱们没有定义主键,模型类会自动帮咱们加了一个以下的id类属性
                    id = models.IntegerField(primary_key=True,auto_created=True)
                    建立的全部模型类实例都自动给个这个属性
        总结:
        1. 每个模型都是django.db.models.Model的子类
        2. 类变量 表示模型中的数据库字段
        3. 每个字段由一个字段类的实例表示
        注意:
        (1)每一个变量名也就是数据库中表的列名,要机器友好,即用ASSIIC码中的字符,不要用中文,不要用数字,不要_开头,数字开头
        (2)字段名中verbose_name参数通常都在第一个位置参数,指定人类可读的名称,若是定义时没有加这个参数,则直接使用字段名
        (3)CharField字段必须提供max_length参数,他是必须参数,不光对数据模型起做用,也对数据库起做用,还对校验起做用(Form表单中会看到)
        (4)字段还有不少可选参数,好比default,它对应数据库中的默认值
    2.激活模型:有了以上建立的模型,django会为这个应用程序建立一个数据库模式,
        也就是先会建立表,生成SQL语句,根据上面的模型类建立去访问Student对象的python数据库的API,
        为了实现这些,咱们要在项目文件夹中的settings.py中注册
        1.在项目中注册app:INSTALLED_APPS中加入app名
        2.运行数据库迁移命令(必定要在项目根目录下)
            python manage.py makemigrations teacher    
                -若是不加app名teacher,则会对(settings.py的INSTALLED里安装过的)全部app进行迁移
            告诉django,咱们作了哪些数据库的更改
            迁移,是django对模型的更改方式,会生成迁移文件,相似于app下的migrations文件夹下的0001_initial.py这样,咱们甚至能够手动更改迁移文件的内容
            迁移以后,mysql中能够能够进入建立的数据库,这时修改只是被记录下来,数据库中尚未表
            sqlmigrate 从迁移获取sql语句:python manage.py sqlmigrate teacher 0001   ---这里不用写全0001_initial.py,teacher这是应用名称,必须写上
                迁移会生成的SQL语句以下:
                --
                -- Create model Student
                --
                CREATE TABLE `teacher_student` (
                `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,         ---若是咱们没有建立主键,这里会自动建立名为id的主键,至关于模型类自动默认给咱们添加了这个类属性,
                `name` varchar(20) NOT NULL,
                `age` smallint NOT NULL,
                `sex` smallint NOT NULL,
                `qq` varchar(20) NOT NULL,
                `phone` varchar(20) NOT NULL,
                `c_time` datetime(6) NOT NULL);
                COMMIT;
        3.运行migrate命令,使迁移生效
            python manage.py migrate teacher    ---若是写上app名,则只会迁移这个app中的模型,不写则注册过的都迁移
            这以后咱们建立的数据库中才会生成表,
        # 表名 appname_模型name.lower
           django_migrations是默认生成的记录migration的表
四.数据的增删改查
    (1)工具 djang shell 调试工具(scrapy的shell借鉴了django的)
    用shell以前最好先在环境中装ipython ,而后直接运行命令进入shell,只要装了ipython,默认就能进入ipython的shell
    python manage.py shell
    (2)进入shell命令行后,首先导入models:from teacher.models import Student   ---输一半按tag能够补全
    想查看student中有没有数据,能够:           Student.objects      ----objects是模型的一个方法,它实际上是一个管理器,
        它自己也是一个对象,建立了模型它就连上了,每个模型都有一个objects,经过objects就能够操做、管理模型
    (3)想查询模型中全部的值,能够Student.objects.all()   
         ---它返回的是一个查询集对象,返回的值不算友好,默认返回<QuerySey:[<Student:Student Object(1)>,<Student:Student Object(2)>,....]>
        若是咱们想让他运行时直接显示实例对象的各个实例属性打印出来,则模型类中能够重写方法__str__:
        def __str__(self):
            return '%s-%s'%(self.name,self.age)
        这个方法对数据库不形成任何影响,不用作数据库迁移,可是重写后须要从新进入shell,并从新导入库才能起做用,
        模型自动建立了id这个属性,这里重写的__str__方法返回值多个self.id也是能够的
         return '%d-%s-%s' % (self.id, self.name, self.age),建立的实例对象都带个id的实例属性
        若是建立了实例对象,这时候Student.objects.all()  的结果是<QuerySey:[<Student:1-贝吉塔-3>,<Student:2-特兰克斯-17>,....]>
    (4)想查询模型中某个值,能够定义s = Student.objects.get(id=1),而后s,得到符合条件的某实例,s.name,s.age这样还能查到该实例的对应属性值

    (5) 增:
        4种方法:在shell环境中,无论什么方法首先都要保证导入了models:from teacher.models import Student
            1)表中一条数据,对应模型类中的一个实例,即一个对象,建立一条,能够实例化一下,表的字段在实例化的过程当中经过传递参数加进去
                (1)实例化:s1 = Student(name='贝吉塔',age='3',qq='123456')
                (2)保存: s1.save()      为了不输错,实例化后数据库中尚未数据,想把实例化的对象保存到数据库,须要运行save方法
                注意存在数据库中的时间字段必定是UTC时间,为了避免同时区不一样格式的统一,
                而取出来的时间则转换成settings里设置的时区,取出来的时间指的是是渲染在模板中显示的时间
                模型类实例中怎么查询,打印,出来的还都是utc时间
            2)建立空实例,而后赋值
                (1)先建立一个空实例s2 = Student()
                (2)依次赋值实例属性s2.name = '特兰克斯'
                          s2.age = 17
                          .....
                  (3)保存:s2.save()
            3)直接create:Student.objects.create(实例属性1,实例属性2.。。)
                这种方法直接操做数据库,给表添加记录
                运行这个命令后,建立记录同时,直接能够返回刚建立的对象
            4)get_or_create:相似于上面的create
                s=Student.objects.get_or_create(实例属性1,实例属性2.。。)
                这种方式先查,查完再建立,返回一个元组,元组第一个元素是该对象,第二个元素是是否建立成功:
                    若是模型中已经有该对象,则元组第一个元素则是该对象,第二个元素是false,即没有建立该对象,是查来的
                    若是模型中尚未该对象,则元组第一个元素是该对象,第二个元素是True,即建立了该对象,
                    ***亲测是否同一对象取决于建立时给的参数是否彻底一致,前面同样多给个元素,也会建立,而不是返回查询结果和False的元组
                        别的参数相同,改其中一个参数,也会建立
            5)增长模型类实例数据,也能够在app的视图函数中,导入模型类,而后定义函数,增长类的实例,上述四种方法,能够在视图函数模块中,先导入模型类
                from .models import Student
                def add_student(request):
                    方法一:实例化,而后save。。。。
                    方法二:实例化一个空的对象,而后定义实例属性,而后save。。。
                    方法三:直接create
                    方法四:get_or_create
                    return render(request,模板文件)

    (6)查:
            1)Student.objects.all()  --查全部,他返回QuerySet对象
                (1)咱们写res=Student.objects.all()的时候,这样写尚未操做数据库,
                它是一个惰性的,只有咱们要把这个值计算出来的时候它才操做数据库
                (2)查询集能够看到sql语句print(res.query),结果其实就是至关于select * from teacher_student的sql语句
                (3)shell中输入res的时候返回的查询集,他能够循环能够迭代,还能够切片
                    切片print(res[1:2].query)
                    切片返回的结果比上面不切片的后面多了两个东西LIMIT 1 OFFSET 1  
                    LIMIT --获取数量,OFFSET偏移量
            2)Student.objects.get(条件)   --查询一条,他返回的不是查询集,而是一个对象,
            执行时马上操做数据库,没有query,拿不到它的sql语句,只能在mysql日志上看到他的sql语句
            至关于数据库中的select * from 表名 where 条件。。。。
            ***get方法返回一条数据,若是匹配到符合条件的有不少条,则会报错
                因此get方法通常只和主键对应,可是表里的主键不见得都叫id
                这里有个快捷方式pk,它表明了表的主键,无论表的主键叫什么,用pk查均可以
            3)filter:res=Student.objects.filter(参数=值)  --返回查询集
                           print(res.query)   -至关于sql中用where的结果

    (7)修改:
            1)赋值:s=Student.objects.get(name='xxx')
                           s.age=16
                           s.save()
                查完修改,用于改一条数据,别忘了save()保存的时候才能把修改保存到数据库
            2)update:Student.objects.filter(name='xxx').update(age=16)
                把匹配出来的全部符合条件的数据的年龄都改为16,返回修改的记录条数
    (8)删除:delete()方法
            1)删一条:s=Student.objects.get(pk=2)
                s.delete()        ----返回一个元组,第一个元素是删除的数据条数,第二个元素是{'表的名称':删除的数据条数}
            2)批量删:Student.objects.filter(sex=1).delete()
                返回元素,(删除的数据条数,{'表名':删除的数据条数})
    (9)计数:Student.objects.count()    ----返回模型类实例数
五。应用到视图:
    1.首先视图函数的模块中导入模型类:from .models import Student
    2.视图函数中student=Student.objects.all()
    3.根据数据库中表的字段修改对应模板的模板变量
    python

相关文章
相关标签/搜索