zoukankan      html  css  js  c++  java
  • 03-Django模型知识1

    模型:是python中的类对应数据库中的表。

    ORM:对象关系映射

    1、基础示例

    学生类模型字段

    class blog(models.Model):
        title = models.CharField(max_length=128)
        creat_time = models.DateTimeField()

    这个字段对应的MySQL中的表如下:

    CAEATE DATABASE blog(
        'id' int(11) NOT NULL AUTO_INCREMENT,
        'title'  varchar(128) NOT NULL,  
        'creat_time' datetime(6) NOT NULL,   
        PRIMARY KEY ('id')
    )

    在关系映射表中,id属于自增字段,是主键,并且不能为空。

    • 模型类必须继承于models.Model。
    • 每个属性对应数据库中的一个字段。
    • 表名中没有指定primary_key,那么会自动创建一个id字段,为自增主键。

    2、应用模型层

    • 注册应用

    当我们在models文件中编写了模型,需要将模型映射到数据库中。

    注册应用,在settings文件中,将子应用blog注册到INSTALLED_APPS中,其结果如下图所示

     在settings中配置正确的数据库连接:

    Django自带的数据库配置是sqlite3,其设置如下:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }

    如果我们需要配置MySQL数据库,则需要将sqlite3的配置注释,重新配置MySQL数据库。其配置方式如下:

    DATABASE = {
        'default':{
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog''USER': 'root',   
        'PASSWORD': '123456',   
        'HOST': '127'.0.0.1',
        'PORT': '3306',
        }    
    }
    1. NAME:表示数据库的名字
    2. PASSWORD:表示数据库的连接密码
    3. USER:用户名字
    4. HOST:代表主机号
    5. PORT:代表端口号
    • 安装数据库对应的驱动

     mysql ,安装 mysqlclient 库
     sqlite3,是不需要额外安装,python自带驱动库

    一些数据库需要首先创建数据库,譬如:mysql、oracle、mssql等

    • 预备迁移
    python manage.py makemigrations blog

    1. blog 是子应用的名称,如果不指定,那么就是对所有 INSTALLED_APPS 中的应用都进行预备迁移。
    2. 指定该命令后,在对应的子应用下的 migrations 中会生成一个对应的迁移文件。

    • 正式迁移
    python manage.py migrate blog

    如果不添加子应用名,则会把所有django项目中所有应用迁移到数据库。

    • 逆向从数据库表生成模型类

    (1)、settings中设置好DATABASES设置

    (2)、对一个数据库中建立好表,约束等

    (3)在根目录的cmd中运行或者在pycharm的控制台运行以下命令

    python manage.py inspectdb >blog/models.py

    表示把数据库中的表映射到blog应用中的models.py文件中。上面的表格其映射出的python代码如下所示:

    class blog(models.Model):
        title = models.CharField(max_length=128)
        creat_time = models.DateTimeField()
    
        class Meta:
            managed = False
            db_table = 'blog'

    anaged = False   这个属性是通知django,不需要再进行从模型到数据库的迁移管理。

    db_table = 'blog' 对应的数据库中的表名

    3、字段Field

     模型类的属性对应数据库中表的字段,都是对应的Field类的实例。

    • 字段命名

    由字母,下划线,数字组成。不能以数字开头。

    字段名称不能是python保留字。

    由于Django查询语法的原因,字段名称不能包含多个下划线。

    • 常用的Field
    类型 说明
    AutoField 自增字段,如果未指定,数据库会自动生成。自己设置该字段,需要把设置为primary_key=True。
    BooleanField 布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。在数据库中显示为
    tinyint(1)
    CharField 字符串类型。必须接收一个max_length参数
    DateField 日期类型。年月日
    DateTimeField 日期时间类型。年月日时分秒
    FloatField 浮点数类型
    SmallIntegerField 小整数,包含-32768到32767
    IntegerField 整数类型
    TextField 文本内容

    示例:UUIDField的使用

    import uuid
    from django.db import models
    
    
    class student(models.Model):
        id = models.UUIDField(primary_key = True, default = uuid.uuid4, editable = False)

    在上面的例子中,uuid.uuid4不能写成uuid.uuid4(),后者表示的是一个固定值。editable = False表示该字段不能编辑。

    • Field的常用参数
    参数 说明
    max_length 字段的最大长度,用于字符串
    null null = True表示数据库可以存储NULL值,默认为False
    blank blank = True表示该字段允许为空白,用于前端用户页面,默认为False,为True时和null一起使用
    primary_key primary_key = True表示为主键,如果没有设置,数据库会自动设置。默认为False
    choices  SEX_CHOICES=((1, '男'),(2, '女')),元组中的第一个元素是将存储在数据库中的值,第二个元素是将在页面中显示的值,最常见用于下拉选择框select
    default  字段的默认值 
    help_text 用于显示额外的'帮助'文本
    unique 该字段在文本中是唯一的
    verbose_name 详细字段名,不指定则是字段的小写名,并用空格代替"_"

    4、模型之间的关系

    主外关系中,最常用的是models.CASCADE级联删除和models.SET_NULL。设置为True。

    一对多关系中,ForeignKey写在一对多关系中,多的那个模型中。

    • 一对一
    from django.db import models
    
    
    class Place(models.Model):
        name = models.CharField(max_length = 64)
        address = models.CharField(max_length = 128)
    
    
    class Restaurant(models.Model):
        place = models.OneToOneField(Place, primary_key = True, on_delete = models.CASCADE)
        serves_pizza = models.BooleanField(default = False)

    在上述例子中,我们使用OneToOne进行关联,BooleanField 在数据库使用 tinyint 类型

    • 一对多
    from django.db import models
    
    
    class Restaurant(models.Model):
        name = models.CharField(max_length = 64)
        address = models.CharField(max_length = 128)
        
    
    class Waiter(models.Model):
        restaurant = models.Foreignkey(Restaurant, on_delete = models.CASCADE)
        name = models.CharField(max_length = 32)

    在上述代码中,一个饭店对应多个服务员,而一个服务员只能服务于一个饭店,所以是一对多的关系。

    • 多对多

    简易多对多

    from django.db import models
    
    
    class Student(models.Model):
        id = AutoField(primary_key = True)
        name = models.CharField(max_length = 32)
        gender = models.Charfield(max_length = 1)
        age = models.IntegerField()
    
    class Teacher(models.Model):
        student = models.ManyToManyField(Student, on_delete = models.CASCADE)
        name = models.CharField(max_length = 32)
        

    简易多对多会创建一个中间表,用于关联两个表的主键,在中间表中,使用的是一对多的关系。

    模型:是python中的类对应数据库中的表。

    ORM:对象关系映射

    1、基础示例

    学生类模型字段

    class blog(models.Model):
        title = models.CharField(max_length=128)
        creat_time = models.DateTimeField()

    这个字段对应的MySQL中的表如下:

    CAEATE DATABASE blog(
        'id' int(11) NOT NULL AUTO_INCREMENT,
        'title'  varchar(128) NOT NULL,  
        'creat_time' datetime(6) NOT NULL,   
        PRIMARY KEY ('id')
    )

    在关系映射表中,id属于自增字段,是主键,并且不能为空。

    • 模型类必须继承于models.Model。
    • 每个属性对应数据库中的一个字段。
    • 表名中没有指定primary_key,那么会自动创建一个id字段,为自增主键。

    2、应用模型层

    • 注册应用

    当我们在models文件中编写了模型,需要将模型映射到数据库中。

    注册应用,在settings文件中,将子应用blog注册到INSTALLED_APPS中,其结果如下图所示

     在settings中配置正确的数据库连接:

    Django自带的数据库配置是sqlite3,其设置如下:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }

    如果我们需要配置MySQL数据库,则需要将sqlite3的配置注释,重新配置MySQL数据库。其配置方式如下:

    DATABASE = {
        'default':{
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'blog''USER': 'root',   
        'PASSWORD': '123456',   
        'HOST': '127'.0.0.1',
        'PORT': '3306',
        }    
    }
    1. NAME:表示数据库的名字
    2. PASSWORD:表示数据库的连接密码
    3. USER:用户名字
    4. HOST:代表主机号
    5. PORT:代表端口号
    • 安装数据库对应的驱动

     mysql ,安装 mysqlclient 库
     sqlite3,是不需要额外安装,python自带驱动库

    一些数据库需要首先创建数据库,譬如:mysql、oracle、mssql等

    • 预备迁移
    python manage.py makemigrations blog

    1. blog 是子应用的名称,如果不指定,那么就是对所有 INSTALLED_APPS 中的应用都进行预备迁移。
    2. 指定该命令后,在对应的子应用下的 migrations 中会生成一个对应的迁移文件。

    • 正式迁移
    python manage.py migrate blog

    如果不添加子应用名,则会把所有django项目中所有应用迁移到数据库。

    • 逆向从数据库表生成模型类

    (1)、settings中设置好DATABASES设置

    (2)、对一个数据库中建立好表,约束等

    (3)在根目录的cmd中运行或者在pycharm的控制台运行以下命令

    python manage.py inspectdb >blog/models.py

    表示把数据库中的表映射到blog应用中的models.py文件中。上面的表格其映射出的python代码如下所示:

    class blog(models.Model):
        title = models.CharField(max_length=128)
        creat_time = models.DateTimeField()
    
        class Meta:
            managed = False
            db_table = 'blog'

    anaged = False   这个属性是通知django,不需要再进行从模型到数据库的迁移管理。

    db_table = 'blog' 对应的数据库中的表名

    3、字段Field

     模型类的属性对应数据库中表的字段,都是对应的Field类的实例。

    • 字段命名

    由字母,下划线,数字组成。不能以数字开头。

    字段名称不能是python保留字。

    由于Django查询语法的原因,字段名称不能包含多个下划线。

    • 常用的Field
    类型 说明
    AutoField 自增字段,如果未指定,数据库会自动生成。自己设置该字段,需要把设置为primary_key=True。
    BooleanField 布尔值类型。默认值是None。在HTML表单中体现为CheckboxInput标签。在数据库中显示为
    tinyint(1)
    CharField 字符串类型。必须接收一个max_length参数
    DateField 日期类型。年月日
    DateTimeField 日期时间类型。年月日时分秒
    FloatField 浮点数类型
    SmallIntegerField 小整数,包含-32768到32767
    IntegerField 整数类型
    TextField 文本内容

    示例:UUIDField的使用

    import uuid
    from django.db import models
    
    
    class student(models.Model):
        id = models.UUIDField(primary_key = True, default = uuid.uuid4, editable = False)

    在上面的例子中,uuid.uuid4不能写成uuid.uuid4(),后者表示的是一个固定值。editable = False表示该字段不能编辑。

    • Field的常用参数
    参数 说明
    max_length 字段的最大长度,用于字符串
    null null = True表示数据库可以存储NULL值,默认为False
    blank blank = True表示该字段允许为空白,用于前端用户页面,默认为False,为True时和null一起使用
    primary_key primary_key = True表示为主键,如果没有设置,数据库会自动设置。默认为False
    choices  SEX_CHOICES=((1, '男'),(2, '女')),元组中的第一个元素是将存储在数据库中的值,第二个元素是将在页面中显示的值,最常见用于下拉选择框select
    default  字段的默认值 
    help_text 用于显示额外的'帮助'文本
    unique 该字段在文本中是唯一的
    verbose_name 详细字段名,不指定则是字段的小写名,并用空格代替"_"

    4、模型之间的关系

    主外关系中,最常用的是models.CASCADE级联删除和models.SET_NULL。设置为True。

    一对多关系中,ForeignKey写在一对多关系中,多的那个模型中。

    • 一对一
    from django.db import models
    
    
    class Place(models.Model):
        name = models.CharField(max_length = 64)
        address = models.CharField(max_length = 128)
    
    
    class Restaurant(models.Model):
        place = models.OneToOneField(Place, primary_key = True, on_delete = models.CASCADE)
        serves_pizza = models.BooleanField(default = False)

    在上述例子中,我们使用OneToOne进行关联,BooleanField 在数据库使用 tinyint 类型

    • 一对多
    from django.db import models
    
    
    class Restaurant(models.Model):
        name = models.CharField(max_length = 64)
        address = models.CharField(max_length = 128)
        
    
    class Waiter(models.Model):
        restaurant = models.Foreignkey(Restaurant, on_delete = models.CASCADE)
        name = models.CharField(max_length = 32)

    在上述代码中,一个饭店对应多个服务员,而一个服务员只能服务于一个饭店,所以是一对多的关系。

    • 多对多

    简易多对多

    from django.db import models
    
    
    class Student(models.Model):
        id = AutoField(primary_key = True)
        name = models.CharField(max_length = 32)
        gender = models.Charfield(max_length = 1)
        age = models.IntegerField()
    
    class Teacher(models.Model):
        student = models.ManyToManyField(Student, on_delete = models.CASCADE)
        name = models.CharField(max_length = 32)
        

    简易多对多会创建一个中间表,用于关联两个表的主键,在中间表中,使用的是一对多的关系。

    建立中间表式多对多,这种方法不需要系统自动生成多对多的中间表,而是手动创建多对多表。

    from django.db import models
    
    class Person(models.Model):
        first_name = models.CharField(max_length=50)
        last_name = models.CharField(max_length=50)
    
    class Group(models.Model):
        name = models.CharField(max_length=128)
        members = models.ManyToManyField(
            Person,
            through='Membership', # 必须是 类名的字符串 ,用 '' 包裹
            through_fields=('group', 'person'),
        )
    
    class Membership(models.Model):
        group = models.ForeignKey(Group, on_delete=models.CASCADE)
        person = models.ForeignKey(Person, on_delete=models.CASCADE)
        level = models.IntegerField(default=1)

    - 通过 through='Membership' 指定Membership作为中间表
    - 通过 through_fields=('group', 'person') 指定中间模型的属性
    - 一般需要自定义中间表时,都是有额外的字段,譬如 level = models.IntegerField(default=1)

  • 相关阅读:
    C# SendKeys用法
    Winform的高DPI问题
    CefSharp在高DPI的屏幕上出现黑边(winform)
    CefSharp支持flash
    CeSharp支持MP4
    C#加密解密总览
    Eclipse 调试Bug之使用断点的七大技巧
    详解Eclipse断点
    怎样编写高质量的java代码
    Quartz任务调度基本使用
  • 原文地址:https://www.cnblogs.com/clearlie/p/13257388.html
Copyright © 2011-2022 走看看