Django模型层

  • 简述

    • Django框架处理业务的逻辑一般如下(省略图,源于网络,侵删)

    • 可以看到,Django自带了一套ORM机制,这也是Django框架的核心—“全面”,将一切能帮开发者完成的率先完成。使用Django开发,只需要知道它的模型层如何使用,甚至可以不用系统学习过数据库及其使用。
    • 在之前的博客,我已经初步介绍了Django的主要组件,以及搭建了一个小站点,在这篇,将详细谈一谈Django模型层的点点滴滴。
  • 注意
    • 使用Django的ORM模型,那么建议预先创建相关的模型文件再进行数据库的迁移。
    • 每个模型类都会被映射到数据库中的一个表,类的属性被映射为表中的字段。(这就是ORM的核心思路)。除此之外,数据库的主键、外键、约束都可以通过类属性定义。
  • 基本操作
    • 模型类定义

      • 一般在该app的models.py文件中
      • 所有Django模型都必须继承自django.db.models.Model类,否则无法完成向实际数据库的迁移。
      • 一般格式
        •   class ModelName(models.Model):field1 = models.XField(...)field2 = models.XField(...)...class Meta:db_table = ...other_metas = ...
          
      • 解析
        • 继承自Model类
        • 通过类属性定义模型字段,必须是某种models.XField类型
          • DjangoField类型与数据库中数据类型对应如下(见源码,这里只列举了常用的MySQL的,其余的可以到django.db.backends.DBName中base.py查看)

            •   _data_types = {'AutoField': 'integer AUTO_INCREMENT','BinaryField': 'longblob','BooleanField': 'bool','CharField': 'varchar(%(max_length)s)','CommaSeparatedIntegerField': 'varchar(%(max_length)s)','DateField': 'date','DateTimeField': 'datetime','DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)','DurationField': 'bigint','FileField': 'varchar(%(max_length)s)','FilePathField': 'varchar(%(max_length)s)','FloatField': 'double precision','IntegerField': 'integer','BigIntegerField': 'bigint','IPAddressField': 'char(15)','GenericIPAddressField': 'char(39)','NullBooleanField': 'bool','OneToOneField': 'integer','PositiveIntegerField': 'integer UNSIGNED','PositiveSmallIntegerField': 'smallint UNSIGNED','SlugField': 'varchar(%(max_length)s)','SmallIntegerField': 'smallint','TextField': 'longtext','TimeField': 'time','UUIDField': 'char(32)',}
              
          • 通过Meta子类定义元数据,如数据库表名,可读化名称,数据排序方式等。
            • Meta类属性名Django预定义,不可以超过这个范围。

              • verbose_name: 字符串表示,该模型的可读化名称。
              • verbose_name_plural: 字符串表示,上述名称的复数形式。
              • abstract: True or False,标识本类是否为抽象基类。
              • app_label: 字符串表示,定义本类所属的应用。
              • db_table: 字符串表示,映射的数据库表名,不写会默认生成一定格式的表名(应用名_模型名),可读性较差。
              • db_tablespace: 字符串表示,映射的表空间名称。表空间的概念只在某些数据库如Oracle中存在,没有这个概念的数据库忽略即可。
              • default_related_name: 字符串表示,定义本模型的反向关系引用名称,默认与模型名一致。
              • get_latest_by:日期或者整形的模型字段,定义按照哪个字段值排列以获得模型的开始或结束记录。
              • managed:True or False,定义Django的manage.py命令行工具是否管理本模型,默认为True。
              • order_with_respect_to: 定义本模型可以按照某外键引用的关系排序。
              • ordering:列表表示,定义本模型所有记录的默认排序字段,可以多个,默认升序,降序则在字段前加负号。(ordering = [‘field1’, ‘field2’]
              • default_permissions: 元组表示, 模型操作权限,默认为(‘add’, ‘change’, ‘delete’)
              • proxy: True or False,本模型及其子模型是否为代理模型。
              • required_db_feathers: 列表表示,定义底层数据库所必备的特性。
              • required_db_cendor: 定义底层数据库类型,如SQLite,MySQL。
              • unique_together: 用来设置的不重复字段组合,必须唯一。如((‘field1’, ‘field2’),)。
              • index_together: 定义联合索引的字段,可以多个。如[[‘field1’, ‘field2’],]。
    • 普通字段
      • 常用字段

        • CharField:字符串字段
        • AutoField:自增的整型字段
        • TextField:大容量文本字段
        • DateField:日期字段
        • 具体参考源码
      • 常用字段参数
        • null:设置该字段数据库字段是否可以为Null
        • blank:设置字段是否可以为空,用于字段的表单验证,即是否可以不输入。
        • choices:设置字段的可选值,二维元组传入,每个元组第一个值是实际存储的值,第二个值是HTML页面进行选择时显示的值。
        • default:设置默认值。
        • help_text:HTML页面输入控件的帮助字符串。
        • primary_key:设置字段是否为主键,只可以设置一个字段,若字段类型是AutoField,那么必须设置为主键。
        • unique:设置是否为字段定义数据库的唯一约束。
        • verbose_name:字段的人性化名称。
    • 关系字段(约束表与表之间)
      • 一对一关系

        • OneToOneField
      • 一对多关系
        • ForeignKey
      • 多对多关系
        • ManyToManyField
    • 基本操作(增删查改)
      • 创建模型

        •   class User(models.Model):name = models.CharField(max_length=10, null=False, verbose_name="名字")age = models.IntegerField(null=False, verbose_name="年龄")class Meta:db_table = 'User'verbose_name = "用户"def __str__(self):return self.name
          
      • 数据库准备迁移
        • 命令行输入python manage.py makemigrations
        • 此时会输出数据库的改变(记住,app一定要加入settings.py文件中)
      • 数据库迁移
        • 命令行输入python manage.py migrate
        • 此时会反馈数据库操作
        • 可以看到,数据库表创建成功,因为没有设置id这个字段,会自动补充并作为主键。
      • 增加
        • 传统的save方法(对对象操作)

          •   user = models.User()user.name = "名称1"user.age = 18user.save()
            
        • create方法
          • models.User.objects.create(name="名称3", age=22)
        • 数据的确加入到数据库中
      • 删除
        • 删除所有

          • User.objects.all().delete()
        • 过滤删除
          • User.objects.filter(name="名称1").delete()
      • 查询
        • 查询所有

          • User.objects.all()
        • 查询指定数据
          • User.objects.get(id=1)
        • 过滤查询
          • User.objects.filter(age=18).distinct()
      • 修改
        • 获得对象再修改

          • user = User.objects.get(id=1)
          • user.name="new"
          • user.save()
        • 获得对象使用update
          • User.objects.get(id=1).update(name="new")
        • 获得对象集合,集体修改
          • User.objects.filter(age=10).update(name="hhh")
      • 注意:django有两种过滤器为filter和exclude,参数一致,前者返回符合条件的,后者返回不符合条件的。
  • 补充说明
    • 具体介绍了模型层的相关内容
    • 本项目参考书为《Python高效开发实战》刘长龙著
    • 使用到的所有重要包会列在requirements.txt文件中
    • 具体代码可以查看我的GitHub,欢迎star或者fork

Web开发-Django模型层相关推荐

  1. 3.1.8 Django模型层详细应用

    在这里肯定有小伙伴会说,前面不是已经引用了模型层了吗?并且在模型层中完成了数据库的操作了呀,为什么还要讲模型层? 首先呢,前面属于我们最传统的处理方式,那种方式过于麻烦,无法很好处理数据.模型层真正应 ...

  2. Django基础五之Django模型层(二)多表操作

    Django基础五之Django模型层(二)多表操作 一 创建模型 表和表之间的关系 一对一.多对一.多对多 # 作者表 比较常用的信息放在这个表中 class Author(models.Model ...

  3. Django 模型层(models) 复杂查询详解

    Django 模型层(models) 复杂查询详解 一般Django orm 和原生sql混合使用 1.测试文件 只单独测试django中的某一个py文件 不一定是tests.py 1.配置 在任意一 ...

  4. Django–模型层orm查询

    文章目录 Django–模型层orm查询 一.单表查询(增.删.改.查) 基本查询 下划线查询 二.外键字段(增.删.改.查) 一对多 多对多 三.多表查询 多表查询的方式 正反向的概念 基于对象的跨 ...

  5. python代码函数字符查询宝典书籍_Django基础五之django模型层(一)单表操作

    二 单表操作 一.创建表 创建模型 创建名为book的app,在book下的models.py中创建模型: from django.db importmodels#Create your models ...

  6. django language_第 58 天:Python Web开发 Django 简介

    今天来为大家介绍 Python 另一个 Web 开发框架 Django,它是一个基于 Python 定制的开源 Web 应用框架,最早源于一个在线新闻 Web 网站,后于2005年开源.Django ...

  7. Web开发-Django视图层

    Django视图层 简述 Django框架处理业务的逻辑一般如下(省略图,源于网络,侵删) 可以看到,用户在输入网站的url之后看到的最直接的页面就是视图,而视图是基于HTML模板文件进行渲染的,数据 ...

  8. Python Web开发:Django+BootStrap实现简单的博客项目

    创建blog的项目结构 关于如何创建一个Django项目,请查看[Python Web开发:使用Django框架创建HolleWorld项目] 创建blog的数据模型 创建一个文章类 所有开发都是数据 ...

  9. Python Web开发——Django框架学习

    文章目录 Web开发简介 Web应用技术 Web前端开发 Web后端开发 使用 Django 开发后端服务 项目目标 管理员操作 登录界面 客户管理界面 添加客户界面 药品管理界面 添加药品界面 订单 ...

最新文章

  1. Android拷贝工程不覆盖原工程的配置方法
  2. opencv2中访问像素的简单方法-自定义一个宏CV_MAT_ELEM2
  3. swift 同步 网络请求_IOS开发中异步网络请求上实现同步逻辑
  4. MapReduce中的partitioner
  5. 数据库出现的bug原因以及解决方法
  6. java中循环语句_Java语法基础之循环结构语句详解
  7. springboot---成员初始化顺序
  8. 用户模式 内核模式 linux,linux – “内核模式”和“用户模式”硬件...
  9. Memcached学习一:Memcached安装使用
  10. 向上取整函数_Excel中平时不用的舍入函数的Floor和Ceiling公式,很实用
  11. python open r w r+ w+ a的区别
  12. 如何避免 $_SERVER[PHP_SELF] 被利用?
  13. post /login.php http/1.1,路由器登录入口:http://192.168.10.1
  14. java绘制棋盘_java绘制五子棋棋盘
  15. 自然语言一般使用计算机,自然语言理解
  16. STM32开发笔记47:STM32F4+DP83848以太网通信指南系列(一):知识储备
  17. Python的生成器函数
  18. pdf转txt java_pdf转换txt怎么操作?pdf文件可以转换成txt文件吗?
  19. 2020七月实训GUI学生信息管理系统
  20. 手游立项(一):理解手游开发

热门文章

  1. SQLErrorCodeSQLExceptionTranslator
  2. SpringMVC的请求-文件上传-客户端表单实现
  3. Hive的基本操作-创建分区表
  4. SpringBoot_配置-properties配置文件编码问题
  5. Spring Cloud Gateway 源码解析(3) —— Predicate
  6. qt 运行库 linux,linux(ubuntu) 版qt5.x安装的一些知识
  7. excel自动生成舒尔特表_EXCEL自动生成的PPT
  8. 在js中如何判断一个对象是否为空
  9. Saltstack-6:模块
  10. Android 自定义的开关按钮——SwitchButton