[TOC]
* * * * *
https://www.cnblogs.com/wupeiqi/articles/6216618.html
* * * * *
# H1 这是一个一级标题 分类
## H2 这是一个二级标题 类
### H3 这是一个三级标题 属性
#### H4 这是一个四级标题 方法
##### H5 这是一个五级标题 参数
###### H5 这是一个六级标题 描述
> 说明:
>[info] 语法:
>[success] 备注:
>[warning] 示例:
>[danger] 警告:
`代码块`
~~~
代码行
~~~
# Object Relational Mapping(ORM)
>[success]概念:
>* 对象关系映射`Object Relational Mapping`,简称`ORM`模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
>* 简单的说,`ORM`是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
>* `ORM`在业务逻辑层和数据库层之间充当了桥梁的作用。
>[success]由来:
> * 让我们从`O/R`开始。字母`O`起源于"对象"`Object`,而`R`则来自于"关系"`Relational`。
> * 几乎所有的软件开发过程中都会涉及到对象和关系数据库。在用户层面和业务逻辑层面,我们是面向对象的。当对象的信息发生变化的时候,我们就需要把对象的信息保存在关系数据库中。
> * 按照之前的方式来进行开发就会出现程序员会在自己的业务逻辑代码中夹杂很多SQL语句用来增加、读取、修改、删除相关数据,而这些代码通常都是重复的。
>[success]优势:
> * `ORM`解决的主要问题是对象和关系的映射。它通常把一个类和一个表一一对应,类的每个实例对应表中的一条记录,类的每个属性对应表中的每个字段。
> * `ORM`提供了对数据库的映射,不用直接编写`SQL`代码,只需像操作对象一样从数据库操作数据。
> * 让软件开发人员专注于业务逻辑的处理,提高了开发效率。
>[success]劣势:
> * `ORM`的缺点是会在一定程度上牺牲程序的执行效率。
> * `ORM`用多了`SQL`语句就不会写了,关系数据库相关技能退化...
>[success]总结:
> * `ORM`只是一种工具,工具确实能解决一些重复,简单的劳动。这是不可否认的。
> * 但我们不能指望某个工具能一劳永逸地解决所有问题,一些特殊问题还是需要特殊处理的。
> * 但是在整个软件开发过程中需要特殊处理的情况应该都是很少的,否则所谓的工具也就失去了它存在的意义。
## 配置数据库
> 参考`Django部署`中的`Datebase`内容
## Model(模型)
>[success]在`Django`中`model`是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型`model`映射到一个数据库表,
基本情况:
> * 每个模型都是一个`Python`类,它是`django.db.models.Model`的子类。
> * 模型的每个属性都代表一个数据库字段。
> * 综上所述,`Django`为您提供了一个自动生成的数据库访问`API`,详询官方文档链接。
![](https://box.kancloud.cn/c161c13fdc6623486ce36db467780052_600x380.png)
### 快速入门
>[warning]下面这个例子定义了一个`Person`模型,包含`first_name`和`last_name`。
~~~
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
~~~
>[warning]`first_name`和`last_name`是模型的字段。每个字段被指定为一个类属性,每个属性映射到一个数据库列。
上面的`Person`模型将会像这样创建一个数据库表:
~~~Sql
CREATE TABLE myapp_person (
"id" serial NOT NULL PRIMARY KEY,
"first_name" varchar(30) NOT NULL,
"last_name" varchar(30) NOT NULL
);
~~~
>[warning]一些说明:
表`myapp_person`的名称是自动生成的,如果你要自定义表名,需要在`model`的`Meta类`中指定`db_table`参数,强烈建议使用小写表名,特别是使用`MySQL`作为后端数据库时。
`id`字段是自动添加的,如果你想要指定自定义主键,只需在其中一个字段中指定`primary_key=True`即可。如果`Django`发现你已经明确地设置了`Field.primary_key`,它将不会添加自动`ID`列。
本示例中的`CREATE TABLE SQL`使用`PostgreSQL`语法进行格式化,但值得注意的是,`Django`会根据配置文件中指定的数据库后端类型来生成相应的`SQL`语句。
`Django`支持`MySQL5.5`及更高版本。
### Filed(字段)
#### AutoField(Field)
>[success]`int`自增列,必须填入参数`primary_key=True`
#### BigAutoField(AutoField)
>[success]`bigint`自增列,必须填入参数`primary_key=True`
>[danger]注:当`model`中如果没有自增列,则自动会创建一个列名为`id`的列
>[warning]示例:
~~~
from django.db import models
# 自动创建一个列名为id的且为自增的整数列
class UserInfo(models.Model):
username = models.CharField(max_length=32)
# 自定义自增列
class Group(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
~~~
#### SmallIntegerField:
>[success]`IntegerField`(整形)
>小整数 -32768 ~ 32767
#### PositiveSmallIntegerField(PositiveIntegerRelDbTypeMixin)
>[success]`IntegerField`(整形)
>正小整数 0 ~ 32767
#### IntegerField(Field)
>[success]整数列(有符号的) -2147483648 ~ 2147483647
#### PositiveIntegerField(PositiveIntegerRelDbTypeMixin)
>[success]`IntegerField`(整形)
>[success]正整数 0 ~ 2147483647
#### BigIntegerField(IntegerField):
>[success]
>长整型(有符号的) -9223372036854775808 ~ 9223372036854775807
#### BooleanField(Field)
>[success]
>布尔值类型
#### NullBooleanField(Field):
>[success]
>可以为空的布尔值
#### CharField(Field)
>[success]
>字符类型
>[danger]必须提供`max_length`参数,`max_length`表示字符长度
#### TextField(Field)
>[success]文本类型
#### EmailField
>[success]字符串类型`CharField`,
>`Django Admin`以及`ModelForm`中提供验证机制
#### IPAddressField(Field)
>[success]字符串类型
>`Django Admin`以及`ModelForm`中提供验证`IPV4`机制
#### GenericIPAddressField(Field)
>[success]字符串类型,
>`Django Admin`以及`ModelForm`中提供验证`Ipv4`和`Ipv6`
##### protocol
>[success]用于指定`Ipv4`或`Ipv6`,` 'both'`,`"ipv4"`,`"ipv6"`
##### unpack_ipv4
>[success]如果指定为`True`,则输入`::ffff:192.0.2.1`时候,可解析为`192.0.2.1`,开启此功能,需要`protocol="both"`
#### URLField(CharField)
>[success]字符串类型
>`Django Admin`以及`ModelForm`中提供验证`URL`
#### SlugField(CharField)
>[success]字符串类型
>`Django Admin`以及`ModelForm`中提供验证支持 字母、数字、下划线、连接符(减号)
#### CommaSeparatedIntegerField(CharField)
>[success]字符串类型
>格式必须为逗号分割的数字
#### UUIDField(Field)
>[success]字符串类型
>`Django Admin`以及`ModelForm`中提供对`UUID`格式的验证
#### FilePathField(Field)
>[success]字符串
>`Django Admin`以及`ModelForm`中提供读取文件夹下文件的功能
##### path, 文件夹路径
##### match=None, 正则匹配
##### recursive=False, 递归下面的文件夹
##### allow_files=True, 允许文件
##### allow_folders=False, 允许文件夹
#### FileField(Field)
>[success]字符串,路径保存在数据库,文件上传到指定目录
##### upload_to = "" 上传文件的保存路径
##### storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
#### ImageField(FileField)
>[success]字符串,路径保存在数据库,文件上传到指定目录
##### upload_to = "" 上传文件的保存路径
##### storage = None 存储组件,默认django.core.files.storage.FileSystemStorage
##### width_field=None, 上传图片的高度保存的数据库字段名(字符串)
##### height_field=None 上传图片的宽度保存的数据库字段名(字符串)
#### DateTimeField(DateField)
>[success]日期+时间格式`YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]`
#### DateField(DateTimeCheckMixin, Field)
>[success]日期格式`YYYY-MM-DD`
#### TimeField(DateTimeCheckMixin, Field)
>[success]时间格式`HH:MM[:ss[.uuuuuu]]`
#### DurationField(Field)
>[success]长整数,时间间隔,数据库中按照`bigint`存储,`ORM`中获取的值为`datetime.timedelta`类型
#### FloatField(Field)
>[success]浮点型
#### DecimalField(Field)
>[success]10进制小数
##### max_digits,小数总长度
##### decimal_places,小数位长度
#### BinaryField(Field)
>[success]二进制类型