ORM模型

369 阅读5分钟

随着项目越来越大,采用原生的sql的方式会出现大量的SQL语句,但是sql语句重复利用率不高,会出现很对相近的sql语句。并且很容易忽略web安全问题,造成安全隐患。ORM可以通过类的方式取操作数据库,而不用使用原生的SQL语句。ORM具有易用性,性能损耗小,设计灵活,可移植性强的优点

创建orm

1.将一个类变为orm模型,要继承django.db.models 下的 Model类或者它的子类。如下:

from django.db import models

class Book(models.Model):
    '''
    id: int类型,自增长
    name: varchar(100) 图书名
    author: varchar(100) 作者
    price: float 价格
    '''
    #自动增长的,主键为TRUE的id
    id = models.AutoField(primary_key=True)
    #最长为100可变字符,不能为空的书名
    name = models.CharField(max_length=100,null=False)
    author = models.CharField(max_length=100,null=False)
    #默认值为0的价格
    price = models.FloatField(null=False,default=0)

映射模型到数据库中

使用python manage.py makemigrations 生成脚本迁移文件

使用python manage.py migrate 将脚本迁移文件映射到数据库中

这样就完成数据迁移一次操作,每更改一次数据库,都要进行一次数据迁移

数据库操作

1.添加

book = Book(name='三国演义',author='罗贯中',price=50)
book = Book(name='西游记',author='吴承恩',price=50)
book.save()

2.根据主键查找

book = Book.objects.get(pk=1)

3.根据其他条件查找

books = Book.objects.filter(name='西游记')

4.删除

book.delete

5.修改

 book.price = xx
 book.save()

ORM模型常用字段

AutoField

映射到数据库中是int型,有自动增长的特性,一般不需要使用,如果不指定主键,那么模型会自动生成一个叫id的主键

BigAutoField

64位整形,类似于AutoField,数据范围更广

BooleanField

在模型层接受的是True/False,在数据库层是tinyint型,如果没默认值,默认为none,需要在类中removed添加默认值

NullBooleanField

接受默认为空

Charfield

在数据库层是varchar,长度可变型字符串,需要指定max_length参数。

DateField

日期类型,python为datetime.date类型,在数据库中是date类型,有两个参数:

1.auto_now:boolean 每次这个数据保存时,都使用当前时间

2.auto_now_add:在每次数据被添加进去的时候,都使用这个时间。

TimeField

时间类型 数据库中为time型

EmailField

最大长度为254个字符的varchar型

FileField

用来储存文件

lmageField

用来储存图片

FloatField

浮点型

lntegerField

整形

BiglntegerField

大整形

PositivelntegerField

正整形

SmalllntegerField

小整形

TextField

大量的文本类型

UUIDField

存储uuid格式的字符串,一般作为主键

URLfield

只能存储url格式的字符串,并且最大长度为200

外键和表的关系

在MYSQL中,表有两种引擎,一种是InnDb,一种是myisam。在djangp中定义为

class ForeignKey(to,on_delete,**options)

示例如下:

class Category(models.Model):
   name = models.CharField(max_length=100)

class Article(models.Model):
   title = models.CharField(max_length=100)
   content = models.TextField()
   #外键关联
   category = models.ForeignKey("Category",on_delete=models.CASCADE)

第一个参数为引用那那个模型,第二个参数为如果引用模型的数据被删除时该如何处理

常用的on_delete参数

1.CASCADE:级联操作,如果外键对应的那条数据被删除,那本数据也被删除

2.PROTECT:受保护,这条数据只要引用的外键那数据,那那条数据就不能被删除

3.SET_NULL:设置为空,如果外键那条数据被删除,那么本条数据这字段设为空

4.SET_DEFAULT:设置默认值

5.SET():如果外键那条数据被删除,那么调用SET中的值作为外键的值,SET是可调用的对象

6.DO_NOTHING:不采取任何行为

如果要引用其他app下的表,路径需要从同级app开始,如有另外一个app front下的表user:

user = models.ForeignKey("front.user",on_delete)

多级表单引用自身

orgin_content = models.ForeignKey('self',**)

表关系

一对多

场景:例如文章与作者,文章只能有一个作者,而作者可以有很多文章

一对多的关联操作

def one_to_many_view(request):
    article = Article(title='三国演义',content='111111')
    #获取外表第一条信息
    category = Category.objects.first()
    article.category = category
    article.save()

通过以获取多 当将一个表单注册为外键时,django会自动生成 当前类_set的方法 例如一个a里面注册了b的外键,就会生成a_set的方法。示例如下:

    category = Category.objects.first()
    #返回该外键对应的主键中的所有匹配
    books = category.article_set.all()

可以更改生成的默认名,在ForeignKey里面指定,关键字related_name,如:

 category = models.ForeignKey("Category",on_delete=models.CASCADE,related_name='articles')

可以通过该方法添加文章,bulk参数指定自动保存如:

article = Article(title='三国演义',content='111111')
category.articles.add(article,bulk=False)

查询操作

exact

精确查找(在windows下,mysql大小写不敏感),操作 属性__exact 相当于‘=’

article = Article.objects.filter(id__exact=1)

iexact

模糊查找 操作 属性__iexact 对应like 相当于正则匹配

content

大小写敏感(包含) 操作 属性__contain 对应like binary %value%

icontent

大小写不敏感 操作 属性__icontent 对应like

聚合函数

聚合函数要放在特定的方法内执行,如:

Book.objects.aggregate()

Avg

求均值

result = Book.objects.aggregate(Avg('price'))

返回一个字典,键为自动生成的默认名 price__avg 可以自动设置默认名 比如 avg = Avg(‘price’)

QuerSet API

模型.objects 对象是django.db.manager.Manager的对象,是一个空壳类,上面的所有方法都是从QuerSet上拷贝来的。

QuerSet 类常用方法

1.filter

将满足条件的数据提取出来

2.exclude

排除满足条件的数据

3.annotate

给QuerSet对象都添加一个使用查询表达式(聚合函数,F表达式,Q表达式,Func表达式)

4.order_by

指定排序顺序

5.values

提取数据时提取那些字段的信息,返回字段:信息的字典

6.values_list

类似values,返回元组

7.pelect_related

提取数据时,可以提前将相关联的数据提取出来,减少数据库查询操作。

8.all

获取这个QuerySet对象

9.prefetch_related

只能用在1对多和多对对

10.defer

过滤一些不需要的字段

11.only

提取指定的字段

12.get

获取满足条件的数据,只能返回一条数据,如果有多条匹配时报错

13.create

创建一条数据,并保存到数据库

14.get_or_create

根据某个条件查找,如果有返回如果没有自己创建一个

15.bulk_create

一次性创建多个数据

16.count

获取提取数据的个数

17.first 和 tail

获取第一条或者最后一条

18.aggregate

使用聚合函数

19.exists

判断某个条件的元素是否存在

20.update

执行更新操作

21.delete

删除满足条件的数据