随着项目越来越大,采用原生的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
删除满足条件的数据