ORM
全拼Object-Relation Mapping
.
中文意为 对象-关系映射
.
MVC
/MVT
设计模式中的Model
模块中都包括ORM
(1)只需要面向对象编程, 不需要面向数据库编写代码.
(2)实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.
mysql
、oracle
...等.在Django中model是你数据的单一、明确的信息来源。它包含了你存储的数据的重要字段和行为。通常,一个模型(model)映射到一个数据库表.
基本情况:
每个模型都是一个Python类,它是django.db.models.Model的子类。
模型的每个属性都代表一个数据库字段。
综上所述,Django为您提供了一个自动生成的数据库访问API。
属性名 = models.字段类型,
定义属性时需要指定字段类型, 通过字段类型的参数指定选项
属性名
AutoField:自动增长的IntegerField, 不指定时Django会自动创建属性名为id的自动增长属性
BooleanField:布尔字段,值为True或False
NullBooleanField:支持Null、True、False三种值
CharField(max_length=20):字符串
TextFiled:大文本字段,一般超过4000个字符时使用
IntegerField:整数
DecimalField(max_digits=None, decimal_places=None):可以指定精度的十进制浮点数
FloatField():浮点数
DateField[auto_now=False, auto_now_add=False]):日期
TimeField:参数和DateField一样
DateTimeField:日期时间,参数同DateField
FileField:上传文件字段,以二进制的形式
ImageField:继承于FileField,对上传的内容进行校验,确保是有效的图片
null:如果为True,表示允许为空,默认值是False
blank:如果为True,则该字段允许为空白,默认值是False
db_column:字段的名称,如果未指定,则使用属性的名称(只限于数据库表中的名字,操作数据库还是类属性的名字)
db_index:若值为True, 则在表中会为此字段创建索引,默认值是False(为了优化查询速度 )
default:默认值,这可以是值或可调用对象。如果可调用,则每次创建新对象时都会调用它。
primary_key:若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique:如果为True, 这个字段在表中必须有唯一值,这个值不能重复,默认值是False
关系型字段类型:关联表中使用
注意:Django会自动为表创建主键字段
默认创建的主键字段为id
,可以使用pk
代替,pk全拼为primary key
class PeopleInfo(models.Model):
name = models.CharField(max_length=20) #人物姓名
gender = models.BooleanField(default=True) #人物性别
description = models.CharField(max_length=20) #人物描述
isDelete = models.BooleanField(default=False) #逻辑删除
book = models.ForeignKey(BookInfo) # 外键约束,人物属于哪本书
pub_date = models.DateField(null=True) #日期
readcount = models.IntegerField(default=0) #阅读量
commentcount = models.IntegerField(default=0) #评论量
isDelete = models.BooleanField(default=False) #逻辑删除
# 元类信息 : 修改表名
class Meta:
db_table = 'peopleinfo'
self
指定作用:修改数据库表的默认的名称
数据库表的默认名称为 :
应用名_模型名
例:Book应用中定义BookInfo模型类
Book_bookinfo
在模型类中定义元类Meta
,用于设置元信息,使用db_table
自定义表的名字
# 书籍信息模型
class BookInfo(models.Model):
name = models.CharField(max_length=20) #图书名称
class Meta: #元信息类
db_table = 'bookinfo' #自定义表的名字
objects
: 管理器对象
是Manager
类型的对象,定义在from django.db import models
中
自定义管理器对象后,Django不再生成默认管理器对象objects
自定义管理器对象
为模型类UserInfo自定义管理器对象Users
# 用户信息模型
class UserInfo(models.Model):
name = models.CharField(max_length=20) #名称
pub_date = models.DateField(null=True) #日期
readcount = models.IntegerField(default=0) #阅读量
commentcount = models.IntegerField(default=0) #评论量
isDelete = models.BooleanField(default=False) #逻辑删除
#元类信息 : 修改表名
class Meta:
db_table = 'Userinfo'
# 自定义管理器对象
Users = models.Manager()
自定义管理器对象后,查询数据时直接使用 Users 查询,不再用默认的objects
# 书籍列表信息视图
def userList(request):
# 查询数据库用户信息 : 默认管理器对象--objects
# UserInfos = UserInfo.objects.all()
# 查询数据库用户信息 : 自定义管理器对象--Users
UserInfos = UserInfo.Users.all()
# 构造上下文
context = {'Userlist':UserInfos}
return render(request, 'User/Userlist.html', context)
Manager:管理器类
定义在from django.db import models
中
Django模型支持自定义管理器类,继承自models.Manager
自定义管理器类主要用于两种情况
自定义管理器类:1.修改原始查询集
把peopleinfo表中的isDelete字段修改为True(updata peopleinfo set isDelete=1 where id=4),但是逻辑删除字段为True的那条记录依然会被查询出来,这里的解决办法是自定义管理器类,重写get_queryset()方法
from django.db import models
# 自定义管理器类
class PeopleInfoManager(models.Manager):
# 自定义管理器类场景一:重写get_queryset()方法
def get_queryset(self):
# 调用父类的成员语法为:super(子类型, self).成员
# 默认只查询逻辑删除字段为False的记录
return super(PeopleInfoManager, self).get_queryset().filter(isDelete=False)
自定义管理器类:2.新增管理器方法
新增管理器初始化模型对象方法:只有name
属性需要赋值,其他的字段都是默认值
# models.py -- 自定义管理器类
class UserInfoManager(models.Manager):
# 自定义管理器类场景一:重写get_queryset()方法
def get_queryset(self):
# 调用父类的成员语法为:super(子类型, self).成员
# 默认只查询逻辑删除字段为False的记录
return super(UserInfoManager, self).get_queryset().filter(isDelete=False)
# 初始化模型对象方法
def create(self, name):
user = UserInfo()
user.name = name
user.pub_date = '1989-11-11'
user.readcount = 0
user.commentcount = 0
user.isDelete = False
return user
# view.py -- User列表信息视图
def UserList(request):
# 初始化模型对象:自定义管理器类后
UserInfos = [
UserInfo.user.create('小明'),
UserInfo.user.create('小杰'),
]
# 构造上下文
context = {'Userlist':UserInfos}
return render(request, 'User/userlist.html', context)