Django框架的数据库和模型

Django下配置使用 mysql 数据库

  • 安装 pymysql包
    $ sudo pip3 install pymysql

  • 安装 mysql 客户端(非必须)
    $ sudo pip3 install mysqlclient

  • 创建和配置数据库

    • 创建数据库
      create database 数据库名 default charset utf8 collate utf8_general_ci;
      如:create database mywebdb default charset utf8 collate utf8_general_ci;

    • 数据库的配置

      • sqlite 数据库配置

        # file: settings.py
        DATABASES = {
            'default': {
                    'ENGINE': 'django.db.backends.sqlite3',
                    'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
            }
        }
        
      • mysql 数据库配置

        DATABASES = {
            'default' : {
                'ENGINE': 'django.db.backends.mysql',
                'NAME': 'mywebdb',  # 数据库名称,需要自己定义
                'USER': 'root',
                'PASSWORD': 'root',  # 管理员密码
                'HOST': '127.0.0.1',
                'PORT': 3306,
            }
        }
        
    • 关于数据库的SETTING配置

      • ENGINE
        指定数据库的后端引擎
        'django.db.backends.mysql'
        'django.db.backends.sqlite3'
        'django.db.backends.oracle'
        'django.db.backends.postgresql'
        
      • NAME 指定要连接的数据库的名称
        'NAME': 'mywebdb'
      • USER 指定登录到数据库的用户名
        'USER':'root'
      • PASSWORD 接数据库时使用的密码。
        'PASSWORD':'123456'
      • HOST 连接数据库时使用哪个主机。
        'HOST':'127.0.0.1'
      • PORT 连接数据库时使用的端口。
        'PORT':'3306'
    • 添加 mysql 支持
      修改项目中__init__.py 加入如下内容来提供pymysql引擎的支持

      import pymysql
      pymysql.install_as_MySQLdb()
      

模型(Models)

  • 模型是一个Python类,它是由django.db.models.Model派生出的子类。
  • 一个模型类代表数据库中的一张数据表
  • 模型类中每一个类属性都代表数据库中的一个字段。
  • 模型是数据交互的接口,是表示和操作数据库的方法和方式

Django 的 ORM框架

  • ORM(Object Relational Mapping)即对象关系映射,它是一种程序技术,它允许你使用类和对象对数据库进行操作,从而避免通过SQL语句操作数据库
  • ORM框架的作用
    • 建立模型类和表之间的对应关系,通过面向对象的方式来操作数据库。
    • 根据设计的模型类生成数据库中的表格。
    • 通过简单的配置就可以进行数据库的切换。
  • ORM 好处:
    • 只需要面向对象编程, 不需要面向数据库编写代码.
      • 对数据库的操作都转化成对类属性和方法的操作.
      • 不用编写各种数据库的sql语句.
    • 实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.
      • 不在关注用的是mysql、oracle…等数据库的内部细节.
      • 通过简单的配置就可以轻松更换数据库, 而不需要修改代码.
  • ORM 缺点
    • 相比较直接使用SQL语句操作数据库,有性能损失.
    • 根据对象的操作转换成SQL语句,根据查询的结果转化成对象, 在映射过程中有性能损失.
  • ORM 示意

在这里插入图片描述

  • 模型示例
    假设项目中已经添加了一个名为bookstore的应用,现在为该应用添加一个模型类代表图书的信息。

    # file : bookstore/models.py
    from django.db import models
    
    class Book(models.Model):
      title = models.CharField("书名", max_length=50, default='')
      price = models.DecimalField('定价', max_digits=7, decimal_places=2, default=0.0)
    

    模型类名是数据表名的一部分,建议类名首字母大写
    字段名又是当前类的类属性名,此名称将作为数据表的字段名
    字段类型用来映射到数据表中的字段的类型
    字段选项为这些字段提供附加的参数信息

  • 字段类型

    • BooleanField()
      数据库类型:tinyint(1)
      编程语言中:使用True或False来表示值
      在数据库中:使用1或0来表示具体的值

    • CharField()
      数据库类型:varchar
      必须要指定max_length参数值

  • DateField()
    数据库类型:date
    作用:表示日期
    编程语言中:使用字符串来表示具体值

    • 参数:
      DateField.auto_now: 每次保存对象时,自动设置该字段为当前时间(取值:True/False)。
      DateField.auto_now_add: 当对象第一次被创建时自动设置当前时间(取值:True/False)。
      DateField.default: 设置当前时间(取值:字符串格式时间如: ‘2019-6-1’)。
      以上三个参数只能多选一
  • DateTimeField()
    数据库类型:datetime(16)
    作用:表示日期和时间
    auto_now_add=True

  • DecimalField()
    数据库类型:decimal(x,y)
    编程语言中:使用小数表示该列的值
    在数据库中:使用小数

    • 参数:
      DecimalField.max_digits: 位数总数,包括小数点后的位数。 该值必须大于等于decimal_places.
      DecimalField.decimal_places: 小数点后的数字数量
    • 示例:
      money=models.DecimalField(
          max_digits=7,
          decimal_places=2,
          default=0.0
      )
      
  • FloatField()
    数据库类型:double
    编程语言中和数据库中都使用小数表示值

  • EmailField()

    • 数据库类型:varchar
    • 编程语言和数据库中使用字符串
  • IntegerField()
    数据库类型:int
    编程语言和数据库中使用整数

  • URLField()
    数据库类型:varchar(200)
    编程语言和数据库中使用字符串

  • ImageField()
    数据库类型:varchar(100)
    作用:在数据库中为了保存图片的路径
    编程语言和数据库中使用字符串

    • 示例:

      image=models.ImageField(
          upload_to="static/images"
      )
      
    • upload_to:指定图片的上传路径
      在后台上传时会自动的将文件保存在指定的目录下

  • TextField()
    数据库类型:longtext
    作用:表示不定长的字符数据

参考文档:https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-types

  • 字段选项FIELD_OPTIONS
    字段选项, 指定创建的列的额外的信息
    允许出现多个字段选项,多个选项之间使用,隔开
    • primary_key
      如果设置为True,表示该列为主键,如果指定一个字段为主键,则此数库表不会创建id字段

    • blank
      设置为True时,字段可以为空。设置为False时,字段是必须填写的。

    • null
      如果设置为True,表示该列值允许为空。
      默认为False,如果此选项为False建议加入default选项来设置默认值

    • default
      设置所在列的默认值,如果字段选项null=False建议添加此项

    • db_index
      如果设置为True,表示为该列增加索引

    • unique
      如果设置为True,表示该字段在数据库中的值必须是唯一(不能重复出现的)

    • db_column
      指定列的名称,如果不指定的话则采用属性名作为列名

    • verbose_name
      设置此字段在admin界面上的显示名称。

    • 示例:

      # 创建一个属性,表示用户名称,
      #长度30个字符,必须是唯一的,不能为空,添加索引
      name = models.CharField(max_length=30, 
      	unique=True, null=False, db_index=True)
      

文档参见:https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-options

数据库迁移

建立好模型类后,需要进行数据库迁移才可以生成数据库表。

  • 迁移步骤
    • 生成迁移文件
      $ python3 manager.py makemigrations
      执行后会在应用目录下的migrations文件加下生成迁移文件
    • 执行迁移文件
      $ python3 manager.py migrate
      执行后会按照模型类的定义在数据库生成对应的表。

注意:
每次修改模型类,都需要执行上面两步迁移步骤,才能使数据库更新。
频繁的修改模型类,在迁移时候会更容易出现迁移失败的问题。

数据库迁移的错误处理方法

当执行 $ python3 manage.py makemigrations 出现如下迁移错误时的处理方法

  • 错误信息

    $ python3 manage.py makemigrations
    You are trying to change the nullable field 'title' on book to non-nullable without a default; we can't do that (the database needs something to populate existing rows).
    Please select a fix:
    1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
    2) Ignore for now, and let me handle existing rows with NULL myself (e.g. because you added a RunPython or RunSQL operation to handle NULL values in a previous data migration)
    3) Quit, and let me add a default in models.py
    Select an option: 
    
  • 翻译为中文如下:

    $ python3 manage.py makemigrations
    您试图将图书上的可空字段“title”更改为非空字段(没有默认值);我们不能这样做(数据库需要填充现有行)。
    请选择修复:
    1)现在提供一次性默认值(将对所有现有行设置此列的空值)
    2)暂时忽略,让我自己处理空值的现有行(例如,因为您在以前的数据迁移中添加了RunPython或RunSQL操作来处理空值)
    3)退出,让我在models.py中添加一个默认值
    选择一个选项:
    
  • 错误原因

    • 当将如下代码
    class Book(models.Model):
        title = models.CharField("书名", max_length=50, null=True)
    
    • 去掉 null=True 改为如下内容时会出现上述错误
    class Book(models.Model):
        title = models.CharField("书名", max_length=50)
    
    • 原理是 此数据库的title 字段由原来的可以为NULL改为非NULL状态,意味着原来这个字段可以不填值,现在改为必须填定一个值,那填什么值呢?此时必须添加一个缺省值。
  • 处理方法:

    • 选择1 手动给出一个缺省值,在生成 bookstore/migrations/000x_auto_xxxxxxxx_xxxx.py 文件时自动将输入的值添加到default参数中
    • 暂时忽略,以后用其它的命令处理缺省值问题(不推荐)
    • 退出当前生成迁移文件的过程,自己去修改models.py, 新增加一个default=XXX 的缺省值(推荐使用)
  • 数据库的迁移文件混乱的解决办法

    • 删除所有 migrations 里所有的 000?_XXXX.py (__init__.py除外)
    • 删除数据库 sql> drop database mywebdb;
    • 重新创建数据库 sql> create datebase mywebdb default charset...;
    • 重新生成迁移文件 python3 manage.py makemigrations
    • 重新更新数据库 python3 manage.py migrate
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值