目录
- 1.ORM构建数据表
- 2.数据迁移
- 3.Model相关的概念与使用方法
- Model的组成部分
- Meta元数据类属性说明
- Field的通用字段选项
- 基础字段类型
- 关系字段类型
- 多对一
- 一对一
- 多对多关系类型
1.ORM构建数据表
django.db.models.Model
django.db.models.Field
首先定义定义抽象Model基类:
class BaseModel(models.Model): class Meta: # 抽象类,表现为BaseModel不会创建数据表 abstract = True # 按照创建时间逆序排序 ordering = ['-created_time'] # 定义了两个类属性:created_time和last_modified,且都是DateTimeField类型 # auto_now_add用于将首次创建对象时间设置为当前时间 # auto_now用于将每次保存对象时间设置为当前时间 created_time = models.DateTimeField(auto_now_add=True, help_text=u'创建时间') last_modified = models.DateTimeField(auto_now=True, help_text=u'修改时间') # 优化打印(print)Model实例的样式 def __str__(self): raise NotImplementedError
django.db.models.Model
例如:话题表
class Topic(BaseModel): title = models.CharField(max_length=255, unique=True, help_text=u'话题标题') content = models.TextField(help_text=u'话题内容') is_online = models.BooleanField(default=True, help_text=u'话题是否在线') user = models.ForeignKey(to=User, to_field='id', on_delete=models.CASCADE, help_text=u'关联用户表') def __str__(self): return '%d:%s' % (self.id, self.title[0:20])
Topic中除了基本类型的字段定义之外,还包含了一个外键(ForeignKey)引用的user字段
评论表:
class Comment(BaseModel): content = models.CharField(max_length=255, help_text=u'话题评论') topic = models.ForeignKey(to=Topic, to_field='id', on_delete=models.CASCADE, help_text=u'关联话题表') up = models.IntegerField(default=0, help_text=u'支持') down = models.IntegerField(default=0, help_text=u'反对') def __str__(self): return '%d:%s' % (self.id, self.content[0:20])
2.数据迁移
post.apps.PostConfig
INSTALLED_APPS = [ 'post.apps.PostConfig', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]
生成迁移文件:
python manage.py makemigrations post
migrate
python manage.py migrate
生成的表结构:
3.Model相关的概念与使用方法
Model的组成部分
django.db.models.Model__str__
Meta元数据类属性说明
Meta类用于定义Model的元数据,即不属于Model的字段,但是可以用来标识它的一些属性
abstract:
一个布尔类型的变量,如果设置为True,则标识当前的Model是抽象基类,这个元选项不具有传递性,只对当前声明的类有效。例如,对于之前定义的BaseModel,用abstract声明为抽象基类,但是子类Topic和Comment不受影响
db_table:
这个字段用于指定数据表的名称
db_table='topic'
ordering:
用于指定获取对象列表时的排序规则
按照created_time逆序排序,可以定义:
ordering = ['-created_time']
先按照created_time逆序排序,再按照last_modified正序排序:
ordering = ['-created_time', 'last_modified']
indexes:
它是一个列表类型的元选项,用来定义Model的索引
- fields:一个列表对象,用于指定索引的字段,是必填项,且至少包含一个字段。
- name:用于标识索引的名称,是可选的,如果不提供,Django会根据不同的数据库生成合适的索引名。
- db_tablespace:表空间,也是可选的,常见于PostgreSQL、Oracle数据库,用于优化数据库性能
unique_together:
标识联合唯一约束,在数据库层面表现为联合唯一索引
Field的通用字段选项
blank:
blank=True
unique:
unique=True
null:
规定这个字段的数据是否可以是空值
db_index:
如果该字段经常作为查询的条件,那么就需要考虑设置db_index选项,以加快数据的检索速度
default:
用于给字段设置默认值
choices:
设置了choices的字段在管理后台的显示上会由文本框变成选择框,选择框中的可选值就是choices中的元组
help_text:
这个选项用于在表单中显示字段的提示信息。例如在管理后台的编辑页面,对应在字段输入框的下方会显示该选项设定的值
基础字段类型
- IntegerField:整型字段
- Django还提供了SmallIntegerField(小整数)、BigIntegerField(64位整数)和PositiveIntegerField(只允许存储大于等于0的整数)等字段类型用来满足存储整数的不同业务场景
- AutoField:一个根据ID自增的IntegerField
- 如果觉得AutoField的取值范围不够用,可以考虑使用BigAutoField
- CharField:字符字段
- TextField:也是用于存储字符类型的字段,但是它用于存储大文本
- BooleanField:布尔类型
- DateField和DateTimeField:标识时间的
- 它们都有两个特殊的参数选项可以设置
- ①auto_now:这个选项应用在对象保存的时候,会自动设置为当前时间
- ②auto_now_add:当首次创建对象的时候,会自动将字段设置为当前时间
- EmailField:专门用来存储电子邮件地址的
- 除了之前介绍的几种常见的类型之外,还有GenericIPAddressField用于存储IP地址、URLField用于存储URL、FloatField用于存储浮点数的字段类型等
关系字段类型
多对一
实例:
user = models.ForeignKey(to=User, to_field='id', on_delete=models.CASCADE, help_text=u'关联用户表')
to
on_delete
- CASCADE:级联删除,它是大部分ForeignKey的定义应该选择的约束。它的表现是删除了“一”,则“多”会被自动删除
- PROTECT:删除被引用对象时,将会抛出ProtectedError异常
- SET_NULL:设置删除对象所关联的外键字段为null。以Topic和Comment的关系举例:删除了Topic,与之相关联的Comment的topic字段会被设置为null
- SET_DEFAULT:将外键字段设置为默认值
- SET(value):删除被引用对象时,设置外键字段为value
- DO_NOTHING:不做任何处理
一对一
实例:
user = models.OneToOneField(to=User, on_delete=models.CASCADE, parent_link=False, help_text=u'关联用户表')
多对多关系类型
实例:
books = models.ManyToManyField(to=Book)