Django ORM

基本概念

ORM,也就是对象关系映射,就是把我们定义的对象(类)映射到对应的数据库的表上面,所以ORM就是代码(软件)层面对于数据库表和关系的一种抽象。
Django的Model就是ORM的一个具体实现。

常用字段

根据类型划分,有以下几种。

数值类型

  • AutoField int(11)  自增主键,Django Model默认提供,可以被重写。完整定义为 id=models.AutoField(primary_key=True)
  • BooleanField  tinyint(1)  布尔类型字段
  • DecimalField decimal  开发对数据精度要求很高的业务时考虑使用,比如支付。定义时,需要指定精确到多少位,比如cash=models.DecimalField(max_digits=8,decimal_places=2,default=0,verbose_name=”消费金额”) ,这个就是定义长度为8位,精度为2位的数字。比如你想保存3333.33,那么max_digits=6,decimal_places=2。在python中也要使用Decimal类型来转换数据,from decimal import Decimal
  • IntegerField  int(11)  同AutoField,但是不自增,范围在 -2147483648 to 2147483647
  • PositiveIntegerField  只包含正整数,0 ~ 2147483647
  • SmallIntegerField  smallint  小整数,-32768 ~ 32767

字符类型

下面的这些字段都是用来储存字符数据的,对应到MySQL中有两种类型:longtextvarchar。除了TextFieldlongtext类型外,其他本质上都是varchar类型。

  • CharField  varchar  基础的varchar类型,必须提供max_length参数,max_length表示字符长度
  • URLField  继承自CharField,但是实现了对URL的处理
  • UUIDField  char(32)  除了在PostgreSQL中使用的是uuid类型外,在其他数据库中均是固定长度char(32),用来存放生成的唯一ID
  • EmailField  继承自CharField,但是实现了对Email的处理
  • FileField  继承自CharField,但是实现了对文件的处理
  • ImageField  继承自FileField,用来处理图片相关的数据,在展示上会有不同
  • TextField  longtext 一般用来存放大量的文本

日期类型

配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
配置auto_now=True,每次更新数据记录的时候会更新该字段。

  • DateField   对应MySQL中的date
  • DateTimeField   对应MySQL中的datetime
  • TimeField   对应MySQL中的time

关系类型

  • ForeignKey : 一般把ForeignKey字段设置在 ‘一对多’中’多’的一方。
    ForeignKey可以和其他表做关联关系同时也可以和自身做关联关系。
  • OneToOneField
  • ManyToManyField

    其中外键和一对一其实是一种,只不过一对一在外间的字段上加了unique,而多对多会创建一个中间表,来进行多对多的关联。

常用参数

  • null : 数据库层面是否允许为空
  • blank : 业务层面是否允许为空
  • choices : 选项,二维数组形式
  • db_column : 默认情况下,我们定义的Field就是对应数据库中的字段名,通过这个参数可以制定model中的某个字段对应数据库中的哪个字段
  • db_index : 索引
  • default : 默认值
  • editable : admin中是否可编辑
  • error_messages : 用来自定义字段值校验失败时的异常提醒,字典格式,key值可以为null,blank,invalid,invalid_choice,unique和unique_for_date
  • help_text : 字段提示语,配置后,在页面对应字段的下方会展示此配置
  • primary_key : 主键,一个model只允许有一个字段是主键
  • unique : 唯一约束,如果设置为True,不需要设置db_index
  • unique_for_date : 针对日期的联合约束,比如我们一天只能有一篇名为《xx》的文章,那么在定义title字段时,可以配置 unique_for_date="created_time",需要注意的是,这并不是数据库层面的约束
  • unique_for_month : 针对月份的联合约束
  • unique_for_year : 针对年份的联合约束
  • verbose_name : 字段对应的展示文案
  • validators : 自定义校验逻辑,和form类似.
如果觉得写的还行,赞助瓶脉动~
0%