zoukankan      html  css  js  c++  java
  • Django之ORM框架

    一、定义

    • 把类和数据表进行映射
    • 通过类和对象就能操作它所对应表格中的数据(CRUD)

    二、数据迁移

    1.配置数据库连接信息

    • 创建数据库和用户
    CREATE DATABASE my_django charset=utf8;
    GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' IDENTIFIED BY '123456';
    flush privileges;

    • 配置数据库

      需要在全局settings.py中的DATABASES字段中配置数据库信息

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'my_django',
            'HOST': 'localhost',
            'PORT': 3306,
            'USER': 'admin',
            'PASSWORD': '123456'
        }
    }
    • 安装mysqlclient
      • 需要满足的依赖
    # Debian/Ubuntu
    sudo apt-get install python-dev default-libmysqlclient-dev
    # Red Hat/CentOS
    sudo yum install python-devel mysql-devel
    # macOS (HomeBrew)
    brew install mysql-client
    pip install mysqlclient

    2.在models.py中定义模型类

    • 可以在子应用projects/models.py文件中定义数据模型
    • 一个数据模型类对应一个数据表
    • 数据模型类,需要继承Model父类或者Model子类
    • 在数据模型中,添加的类属性(Field对象)来对应数据表中的字段
    from django.db import models
    
    
    class Projects(models.Model):
        name = models.CharField(max_length=200)
        age = models.CharField(max_length=50)

    3.迁移

    # 生成迁移脚本
    python manage.py makemigrations
    # 生成数据表
    python manage.py migrate

      执行以上两条命令过程如下:

      然后进入刷新数据库后,可以看到有对应的表已经成功创建:

      再看看刚刚创建的表结构:

      当然上面生成迁移脚本和创建数据库表的命令行都是针对所有的,如果只想创建某一个子应用的表呢?只需要在上面的命令行后面跟上子应用名即可

    # 生成指定应用的迁移脚本
    python manage.py makemigrations 子应用名称
    # 生成指定应用的数据表
    python manage.py migrate
    子应用名称

      执行指定的迁移脚本还有另一种命令行,迁移脚本要先生成出来才能生效,生成的迁移脚本会存放在子应用目录下的migrations下

    python manage.py sqlmigrate 子应用名称 迁移脚本

    3.表的创建

    在第二步的迁移步骤中,已经实现了如何通过数据模型创建数据库表,我们知道数据库表字段有各种属性,如长度、字符类型、约束条件、默认值等等,在Django的数据模型中,我们并不需要去编写sql语句来创建数据库表,而是可以通过类和对象的方式进行数据库的增删改查等操作,这样就方便了许多。

      AutoField类、CharField类、IntegerField类、TextField类、DecimalField类、DateTimeField类、DateField类、TimeField类等等,它们都继承了Field父类,我们通过查看Field源码的构造方法,可以看到很多关于字段的属性设置

       这里拿出常用的属性进行说明:

    • verbose_name:个性化信息
    • primary_key:主键约束,如果某一个字段中设置了primary_key=True,那么Django就不会自动创建id字段
    • max_length:至少要指定一个该字段,它代表此字段的最大长度,不能为负数,最大长度不能超过200
    • unique:唯一键约束
    • blank:指定前端用户在创建数据时,是否需要传递,默认需要传递,如果不传递,设置为True
    • null:指定数据在保存时是否可以为空,默认不能为空,为空设置为True
    • default:指定默认值,往往会跟black一起使用
    • help_text:帮助文本信息,在api接口文档平台和admin后端站点中会用于提示,往往跟verbose_name一致

      而DateTimeField类、TimeField类也继承了DateField类,DateField类中的构造方法也有新的参数

      其中:

    • auto_now:设置成True后,Django会自动添加更新记录时的时间
    • auto_now_add:设置成True后,Django会自动添加创建记录时的时间

      我们开始通过数据模型自定义一些字段:

    from django.db import models
    
    
    class Projects(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=200, verbose_name="项目名称", help_text='项目名称', unique=True)
        leader = models.CharField(max_length=50)
        programmer = models.CharField(max_length=50, verbose_name="开发人员", help_text="开发人员")
        tester = models.CharField(max_length=50, verbose_name="测试人员", help_text="测试人员")
        desc = models.TextField(verbose_name='项目简介', help_text="项目简介", blank=True, default="XXXX", null=True)
        create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间", help_text="创建时间")
        update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间", help_text="更新时间")

      同样进行数据迁移,得到的结果:

    3.修改表名

      按照上面的操作生成的数据库表的表名默认为:子应用名称_模型类名小写,如果想自定义表名,只需要在数据模型类下面定义一个Meta的子类

    from django.db import models
    
    
    class Projects(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=200, verbose_name="项目名称", help_text='项目名称', unique=True)
        leader = models.CharField(max_length=50)
        programmer = models.CharField(max_length=50, verbose_name="开发人员", help_text="开发人员")
        tester = models.CharField(max_length=50, verbose_name="测试人员", help_text="测试人员")
        desc = models.TextField(verbose_name='项目简介', help_text="项目简介", blank=True, default="XXXX", null=True)
        create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建时间", help_text="创建时间")
        update_time = models.DateTimeField(auto_now=True, verbose_name="更新时间", help_text="更新时间")
    
        class Meta:
            # Meta子类的类名固定,可以使用db_table类属性来指定表名,使用verbose_name类属性指定表的个性化描述
            db_table = 'tb_projects'
            verbose_name = '项目表'

      删除原来的表之后重新迁移,数据库中刷新后,可以看到已经变更为自定义的表名了

    三、CRUD

    在CRUD操作之前,为了更好的debug,我们可以引入connection模块,它可以在我们进行CRUD操作时,会显示出对应的sql语句,通过sql语句,可以及时发现错误,也可以看到sql语句的性能是否达到最优

    在视图模块中引入connection模块:

    from django.db import connection

    调试器上添加“connetion.queries”:

    1.c(create)

      向数据表添加一条记录,两种方法

      1.使用模型类对象来创建

      2.使用查询集的create方法

    2.r(retrieve)

    • 获取一个数据表的所有记录
      • 返回所有记录组成的模型对象集合(queryset查询级)
    • 获取指定记录
      • get
      • filter
      • exclude

      查询操作通过在视图方法中使用创建数据模型对象的方式,去调用它的get/filter/exclude方法

    get:(1)一般只能使用主键或者唯一键作为查询条件;(2)如果查询的记录为空或者多条记录,会抛出异常;(3)返回的模型类对象,会自动提交

    filter:通过过滤的方式查询,每个字段都提供了很丰富的选项进行查询操作

    exclude:与filter相反,为反向过滤

      先提前在数据库创建几条数据:

    1.get方法

    2.filter方法

    3.exclude方法

    3.u(update)

    1.先获取模型类对象,然后修改某些字段,再调用save方法保存

    2.可以使用模型类名.objects.filter().update()

    显然第二种更好,sql语句性能优越

    4.d(delete)

    1.获取模型类对象,然后删除

    2.可以使用模型类名.objects.filter().delete()

  • 相关阅读:
    摇骰子游戏
    那些年,产品提出的无理需求
    cookie中数据无法读取,HttpOnly属性
    vue 使用字典值及其翻译
    微信小程序picker组件两列关联使用方式
    fatal: unable to access 'https://github.com/xxxxxgit/': OpenSSL SSL_connect: Connection was reset in connection to github.com:443
    Oracle数据库以date类型保存日期时 nvalid request: Out of range property; SalesOrder.date'
    Event Handler Content must support at least one class.
    Minimum length not met: value 0 < 1 minimum length
    Oracle中使用hash_hmac() 函数报错问题/以及Oracle遇到Oauth1.0授权和oauth_signature生成规则
  • 原文地址:https://www.cnblogs.com/xiaogongjin/p/13173948.html
Copyright © 2011-2022 走看看