Django day04 模型,模型中的CRUD

目录

1. 模型 - Models

    1.什么是模型

    2.创建和使用模型 - ORM

    3.编写Models(重难点)

5.模型中的 CRUD

    1.通过 ORM 向 数据库中 增加数据

    2.查询数据(重难点)


1. 模型 - Models

    1.什么是模型

        模型,是根据数据库中数据表的结构来创建出来的class, 
        每一张表对应到编程语言就是一个class,表中的每一个列,到编程语言中就是class中的一个属性

    2.创建和使用模型 - ORM

        1.什么是ORM

            ORM : Object Relational Mapping
            简称:ORM,O/RM,O/R Mapping
            中文: 对象关系映射

            三大特征:
                1.数据表 到 类(class) 的映射
                    允许将数据表(Table) 自动生成一个 类(Class)
                    允许将类(Class) 自动生成一个 数据表(Table)
                2.数据类型的映射
                    允许将表中字段的数据类型 自动 映射成编程语言中对应的数据类型
                    允许将编程语言中的数据类型 自动 映射成表中字段对应的数据类型
                3.关系映射
                    允许将表与表之间的关系 自动 映射成类与类之间的关系
                    允许将类与类之间的关系 自动 映射成表与表之间的关系 

        2.ORM的优点

            1.提高了开发效率,能够自动完成表与类之间的映射
            2.可以省略庞大的数据访问层,即便不用SQL编码,也能完成对数据库的CRUD操作

        3.创建 和 配置 数据库

            1.创建数据库(支持中文)
                create database 数据库名 default charset utf8 collate utf8_general_ci;
            2.Django中数据库的配置
                在 settings.py中配置数据库的信息
                DATABASES={
                    'default':{
                        'ENGINE':'...',
                        'NAME':'...',
                    }
                }
                连接MySQL数据库的配置:
                    1.ENGINE:连接到数据库的引擎(驱动程序)
                        django.db.backends.mysql
                    2.NAME:要连接的数据库名称
                    3.USER:用户名称,通常为 root
                    4.PASSWORD:密码,学习为 123456
                    5.HOST:要连接的主机
                        本机:localhost 或 127.0.0.1
                    6.PORT:指定端口号
                        MYSQL:3306
                注意:
                    Django 中要连接MySQL数据库的话依赖于 MySQLdb
                    通过 pymysql 解决问题
                        sudo pip3 install pymsql==0.7.11
                    在项目的主目录中__init__.py:
                        import pymsql
                        pymysql.install_as_MySQLdb()

        4.数据库的同步操作

            1. ./manage.py makemigrations
                作用:将每个应用下的models.py文件生成一个数据库的中间文件
                      并将中间文件保存在migrations的目录中
            2. ./manage.py migrate
                作用:将每个应用下的migrations目录中的中间文件同步到数据库中

    3.编写Models(重难点)

        1.注意
 
            1.Models中的每个class都称为模型类(Model) 或 实体类(Entry)
                实体:表示的就是数据库中表中的一条记录
                实体完整性:约束表中的记录不完全重复
            2.Models中的每个类都必须继承自models.Model

        2.举个例子

            在 index 应用中的 models.py 中
            from django.db import models
            # 创建 Publisher 实体类
            # 表示 出版社 的信息,属性如下:
            # 1.name : 出版社的名称(varchar,string)
            # 2.address : 出版社的地址(字符串,长度50)
            # 3.city : 出版社所在城市(字符串,长度20)
            # 4.country : 出版社所在国家(字符串,长度20)
            # 5.website : 出版社的网址
            class Publisher(models.Model):
                name = models.CharField(max_length=30)
                address = models.CharField(max_length=50)
                city = models.CharField(max_length=20)
                country=models.CharField(max_length=20)
                website=models.URLField()

        3.Django中的Models的语法

            语法:
                class ClassName(models.Model):
                    属性 = models.字段类型(字段选项)
                字段类型:映射到数据库表中的数据类型
                    CharField - varchar
                字段选项:对生成的字段的说明信息
                    max_length = 30

            字段类型(Field Types)
                1.BooleanField() 布尔值类型
                2.CharField() 字符串类型
                3.DateField() 年月日
                4.DateTimeField() 年月日时分秒
                5.DecimalField() 小数
                    money=models.DecimalFields(max_digits=7,decimal_places=2)
                6.EmailField()
                    #存电子邮件地址 - varchar
                7.FloatField() 浮点数类型
                8.ImageField()
                    #存图片路径 - varchar
                    uimg=models.ImageField(upload_to='images/users/')
                9.IntegerField() 整数类型
                10.URLField()
                    # 存网址 - varchar
                11.TextField()
                    # 存大量数据 - text

            字段选项(Field Options)
                1.default
                    为当前属性(字段)指定默认值
                2.null
                    指定当前属性(字段)的值是否允许为空,默认为False,表示不能为空
                3.db_column
                    指定当前属性(字段)对应到数据库的列名,如果不指定则采用属性名作为列名

            练习:
                1.在models.py中追加2个class
                    1.Author - 作者
                        1.name - 姓名
                        2.age - 年龄
                        3.email - 邮箱(允许为空)
                    2.Book - 图书
                        1.title - 书名
                        2.publicate_date - 出版时间
                2.生成日志文件,再同步回数据库

                class Author(models.Model):
                    name = models.CharField(max_length=20)
                    age = models.IntegerField()
                    email = models.EmailField(null=True)

                class Book(models.Model):
                    title = models.CharField(max_length=50)
                    publicate_date = models.DateField()

                ./manage.py makemigrations
                ./manage.py migrate


    4.相关指令

        1.数据的版本切换

            1.  ./manage.py migrate
                执行所有应用中最新版本的数据库中间文件
            2.  ./manage.py migrate 应用名称 版本号
                ./manage.py migrate index 0003

        2.通过数据库自动导出models
            ./manage.py inspectdb > 文件名.py

5.模型中的 CRUD

    1.通过 ORM 向 数据库中 增加数据

        1.Entry.objects.create(属性=值,属性=值)
            返回值:创建好的实体
        2.创建一个Models对象,并通过save()完成增加
            obj = Entry(属性=值,属性=值)
            obj.save()
        3.使用字典构建对象,并调用其save()完成增加
            dic = {
                '属性1':'值1',
                '属性2':'值2',
            }
            obj = Entry(**dic)
            obj.save()

        练习:
            使用三种方式,分别向
                index_book,index_publisher 中各增加三条数据

    2.查询数据(重难点)

        通过 Entry.objects 调用查询接口
        1.基本查询操作
            语法:all()
            用法:Entry.objects.all()
            返回:QuerySet(查询结果集,是一个封装了若干对象的列表)
        2.查询指定列的操作
            语法:values('列1','列2',...)
            用法:Entry.objects.values('列1','列2')
            返回:QuerySet
            注意:values()可以用在所有查询返回QuerySet的方法的后面
                如: Author.objects.all().values('name','age')
        3.查询指定列的操作
            语法:values_list()
            用法:Entry.objects.values_list()
            返回:QuerySet,是一个由若干元组所组成的列表
        4.对查询数据进行排序        
            语法:order_by()
            用法:Entry.objects.order_by('列1','-列2')
                默认是升序排序,列名前加"-",则表示该列按降序排序
        5.对条件取反
            语法:exclude()
            用法:Entry.objects.exclude(条件)
            1.
                Author.objects.exclude(id=3)
                select * from index_author where not (id=3)
            2. 
                Author.objects.exclude(id=3,age=85)
                select * from index_author where not (id=3 and age=85)

    作业:
        从 AUthor 中取出所有的数据,并显示在 模板中(table)
            姓名    年龄    邮箱               操作
            老舍    85     [email protected]     删除 修改
            老舍    85     [email protected]     删除 修改
            巴金    75     [email protected]      删除 修改
            冰心    95     [email protected]    删除 修改

练习代码 

猜你喜欢

转载自blog.csdn.net/zh__quan/article/details/82148683
今日推荐