个人博客

Django ORM介绍

简介

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)
相关标签
回到顶部