Django ORM介绍
作者:向前的步伐 / 发表: 2019年11月16日 20:30 / 更新: 2019年11月16日 20:30 / django / 阅读量:517
简介
ORM即对象关系映射,它的作用就是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道,只需要简单的操作对象的属性和方法。
ORM的优势
只需要面向对象编程,不需要面向数据库编写代码。
实现了数据模型与数据库之间的解耦,屏蔽了不同数据库操作上的差异。
ORM的劣势
相比较直接使用SQL语句操作数据库,会有性能上的损失。
根据对象的操作转换成SQL语句,根据查询的结果转化成对象,在映射过程中有性能损失。
用法
字段类型
属性名 = models.字段类型,定义属性时需要指定字段类型,通过字段类型的参数指定选项。
属性名定义时注意:1,不允许使用python保留关键字;2,不允许使用mysql保留关键字;3,不允许使用连续的下划线,因为Django的查询语法就是用连续的下划线。
AutoField:自动增长的IntegerField,不指定时,Django会自动创建属性名为id的自动增长属性。
BooleanField:布尔字段,值为True或者False。
NullBooleanField:支持Null、True、False。
CharField(max_length):字符串。参数max_length表示最大字符个数。
TextField:大文本字段,一般超过4000个字符时使用。
IntegerField:整数。
DecimalField(max_digits=None, decimal_places=None):可以指定精度的十进制浮点数。参数max_digits表示总位数;参数decimal_places表示小数位数。
FloatField:浮点数。
DateField(auto_now=False, auto_now_add=False):日期。参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于“最后一次修改”的时间戳,它总是使用当前日期,默认为False;参数auto_now_add表示当对象被第一次创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为false;参数auto_now_add和auto_now是相互排斥的,组合将会发生错误。
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;如果设置某属性为主键字段后,Django就不会再创建自动增长的主键字段。
关系字段类型
ForeignKey:一对多,将字段定义在多的一端中。
ManyToManyField:多对多,将字段定义在任意一端中。
OneToOneField:一对一,将字段定义在任意一端中。
元选项
默认情况下,数据库表的默认名称为应用名_模型名,例如:Book应用中定义Info模型类,则默认表名为book_info。
在模型中定义元类Meta,用于设置元信息,可以使用db_table属性定义表的名字。
class Info(models.Model):
name = models.CharField(max_length=20)
class Meta:
db_table = "bookinfo" # 自定义表名
模型成员
类中的objects是管理器对象,用于模型对象和数据库交互。也可以自定义管理器对象,替代objects对象。
# 用户信息模型
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)