Python_Django开发笔记二——ORM简介
前言
上一篇,简单介绍了Django网站的创建与运行。Django显著的特点是应用ORM(Object Relational Mapping)对象关系映射处理数据,建立数据模型类与数据库的映射关系,使业务逻辑通过类对象更好的实现,避免繁琐的SQL语句。
在此,先补充一点细节:
在setting.py中修改变量,设定中文与时区
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
ORM的特点
优点
操作数据库不需要通过SQL语句,专注业务逻辑就行。
缺点
本质是还是对SQL语句的封装,所以必然会牺牲一定的执行效率,但是也许一般程序员使用SQL语句的执行效率牺牲更多?!
实际情况
本质
ORM的映射是 数据模型(Model)映射 数据库表。一一对应,类的属性映射为数据库表字段,类的实例对象映射为数据行(记录)
。
ORM的功能
- 生成数据库表——创建、修改、删除;
- 操作数据库表的数据行——增、删、改、查;
可以发现,ORM不能自己创建数据库,需要在现有数据库中操作。
ORM的使用步骤
- 建立数据库
- 连接数据库
- 编写数据模型
- 生成数据库表
- 使用Django ORM操作数据库表
(前4步看上一篇)
ORM的用法
创建数据模型
名称 | 属性 |
---|---|
group | name |
script |
from django.db import models #导入模块,必须项
class Group(models.Model): #类继承
group_name=models.CharField(max_length=32,verbose_name='团体名称')
group_script = models.CharField(max_length=60, verbose_name='备注')
常见字段(类属性)
字段包括字段与属性参数,常见字段如下:
user = models.CharField(max_length=32, verbose_name='姓名') #字符型
email = models.EmailField(verbose_name='邮箱') #邮箱类型,实际上也是字符类型,但是提供邮箱格式检验
depart = models.TextField(verbose_name="部职别") #文本类型,字符串超过254字符时使用
joinDate = models.DateField(verbose_name='加入时间', auto_now=False, auto_now_add=False) #日期字段 第一个参数自动保存当前时间,即最后修改时间,第二个参数字段设置当前时间,即记录对象创建时间
int = models.IntegerField() #整数类型
joinTime = models.TimeField( auto_now=False, auto_now_add=False) #时间字段
dateTime = models.DateTimeField(auto_now=False, auto_now_add=False)
fileTest = models.FileField(upload_to = '/myproject/') #文件上传至指定路径upload_to 中,与setting.py中的MEDIA_ROOT变量有关,文件路径为/MEDIA_ROOT/upload_to/fileTest fileTest的值可以为test.txt
picture = models.ImageField(upload_to = '/myproject/') #图片文件上传至指定路径upload_to 中
常见的字段属性有:
db_index
title = models.CharField(max_length=32, db_index=True) #表示该字段为数据库表的索引
unique
title = models.CharField(max_length=32, unique=True) #表示该字段在数据库表中为唯一值
default
title = models.CharField(max_length=32, default='true') #表示该字段的默认值
基本数据操作
数据库表的基本操作是增删改查,ORM是通过数据模型的objects属性这个接口完成数据操作。
一般形式如下:
models.数据库表.objects.函数()
常用函数如下,返回值为QuerySet对象集
,该对象集对应数据库表的记录集合,但是只有当我们用到该值时,它才会去数据库表中获取数据。
#all()函数
group_list = models.Group.objects.all()
#filter()函数 字段过滤用 字段名+双下划线+条件名词
group_list = models.Group.objects.filter(name='zkz')
#忽略大小写
group_list = models.Group.objects.filter(name__icontains='zkz')
#id等于1,2,3的数据
group_list = models.Group.objects.filter(id__in=[1, 2, 3])
#id不等于1,2,3的数据
group_list = models.Group.objects.exclude(id__in=[1, 2, 3])
#id大于1且小于10的记录
group_list = models.Group.objects.filter(id__gt=1, id__lt=10)
#id在范围1-10内的数据
group_list = models.Group.objects.filter(id__range=[1,10])
#exclude()函数 返回不符合值
group_list = models.Group.objects.exclude(id__in=[1, 2, 3])
#distinct()函数 去掉重复记录,然后返回记录集
group_list = models.Group.objects.filter(name='zkz').distinct()
#value()函数 返回字典类型序列
objects = models.Group.objects.values('name','id')
增加记录
#第一种
group = models.Group.objects.create(name='zkz', id=1)
#第二种
group = models.Group(name='zkz', id=1)
group.save()
删除记录
过滤一般过滤主键
#过滤后删除
models.Group.objects.filter(name='zkz').delete()
修改记录
#指定条件修改——可多条
models.Group.objects.filter(name='zkz').update(id='2')
#修改单条数据
group = models.Group.objects.get(name='zkz')
group.id = '3'
group.save()
查询记录
#获取全部
group_list = models.Group.objects.all()
#获取单条数据
group = models.Group.objects.get(name='zkz')
#指定条件获取
group_list = models.Group.objects.filter(name='zkz')