Django ORM
ORM是对象关系映射,Django ORM描述了数据模型类和数据库之间的映射关系,就是让一个类和一个数据库表进行对应,这使ORM在数据库层和业务逻辑层之间起到了桥梁的作用。Django ORM通过统一格式的业务逻辑代码操作数据库,把SQL语句统一转换为较为固定的Django语法结构。Django ORM能够避免一些重复的工作,在ORM模式下开发人员不需要写SQL语句,可以只关注业务逻辑的处理,从而提高开发效率。Django ORM的缺点是操作数据库的语法与SQL语句有很大差别,需要记住很多特殊语句。Django ORM本质上是对SQL语句功能的封装,最终还是转化成SQL来操作数据库。
Django ORM与数据库映射的关系是一个数据模型映射成一个数据库表。类映射成数据库表,类的属性映射成数据库表字段,类的实例映射成数据行。Django ORM的功能有生成数据库表,操作数据库表的数据行,但是不能够创建数据库。
Django ORM使用步骤:
(1)创建数据库;
(2)在配置文件settings.py中设置数据库连接字符;
(3)在应用程序的models.py文件中编写继承了models.Model的数据模型;
(4)运行python manage.py makemigrations
、python manage.py migrate
两个命令生成数据库表;
(5)使用Django ORM操作数据库表。
- Django ORM字段类型
(1)CharField,字符类型,必须提供字符长度max_length参数,verbose_name参数为字段别名,在SQL层面没有具体的体现。
(2)EmailField,邮箱类型,实际上也是字符类型,只是提供了邮箱格式检验。
(3)TextField,文本类型,存储大文本字符串。
(4)IntegerField,整数类型。
(5)DateField,日期类型。
(6)TimeField,时间字段。
(7)DateTimeField,日期时间字段,结合了日期与时间。
(8)FileField,实际是字符串类型,把上传的文件路径保存在数据库中。
(9)ImageField,实际是字符串类型,用来把上传的图片路径保存在数据库中。
# auto_now自动存储当前时间,一般表示最后修改时间,auto_now_add记录创建时间
date = models.DateField(auto_now=True, auto_now_add=False)
# upload_to指定上传文件的保存路径
filetest = models.FileField(upload_to='test/')
- 常用字段属性
(1)db_index:True表示设置这个字段为数据库表的索引。
(2)unique:True表示字段在数据库表中不能有重复值。
(3)default:设置默认值。
(4)auto_now_add:True表示把创建时间。
(5)auto_now:True表示更新时间。
- 基本数据操作
(1)增加记录
#通过数据模型的objects属性提供数据操作的接口
#方法1
new_emp= models. employee.objects.create(name="tom",email="tom@163.com",dep_id=66)
#方法2
new_emp= models.employee (name= "tom",email="tom@163.com",dep_id=66)
new_emp.save()
(2)删除记录
# 使用filter过滤出符合条件的记录
models.employee.objects.filter(name= "张三").delete()
(3)修改记录
# 将指定条件的记录更新,并更新指定字段的值
models.employee.objects.filter(name='tom').update(email="tom2@163.com")
# 修改单条数据
obj = models.employee.objects.get(id=66)
obj.email = "tom2@sina.com"
obj.save()
(4)查询
# 获取全部
Emp_list= models.employee.objects.all()
# 获取单条数据,数据不存在则报错
Emp=models.employee.objects.get(id=123)
# 获取指定条件的记录集
Emp_group=models.employee.objects.filter(name= "张三")
- 数据操作常用函数
(1)all函数,返回符合条件的全部记录;
objects = models.employee.objects.all()
(2)filter函数,返回指定条件的记录;
# 字段名+双下划线+条件名词
models.employee.objects.filter(name__contains="Tom")
(3)exclude函数,返回不符合括号内条件的记录;
models.employee.objects.exclude(name__contains="Tom")
(4)order_by函数,按照指定字段排序;
# 字段名加负号表示倒序,默认正序
objects = models.employee.objects.exclude(name='tom').order_by('-name','id')
(5)distinct函数,去除重复记录;
models.employee.objects.filter(name="Tom").distinct()
(6)values函数,返回一个字典类型序列;
objects = models.employee.objects.values('id','name','email')
(7)values_list函数,返回一个元组类型序列;
objects = models.employee.objects.values_list('id','name','email')
(8)get、first、last函数返回单个对象。
# 返回id为1的记录,括号内是过滤条件
object1 = models.employee.objects.get(id=1)
# 返回数据集的第一条记录
object2 = models.employee.objects.first()
# 返回数据集的最后一条记录
object3 = models.employee.objects.last()
# 返回数据集的个数
object4= models.employee.objects.count()
- 示例
# 创建了员工数据模型、部门数据模型、团体数据模型、员工补充信息模型
class employee(models.Model):
name = models.CharField(max_length=32, verbose_name='姓名')
email = models.EmailField(verbose_name='邮箱')
# 部门与员工是一对多的关系,有外键的表是多,外键关联表是一。
dep = models.ForeignKey(to='department', on_delete=models.CASCADE)
# 员工和团体是多堆垛的关系
group = models.ManyToManyField(to='group')
salary = models.DecimalField(max_digits=8, decimal_places=2)
# 员工与员工信息是一对一的关系
info = models.OneToOneField(to='employeeinfo',
on_delete=models.CASCADE, null=True)
class department(models.Model):
dep_name = models.CharField(max_length=32, verbose_name='部门名称')
dep_script = models.CharField(max_length=60, verbose_name='备注')
class group(models.Model):
group_name = models.CharField(max_length=32, verbose_name='团体名称')
group_script = models.CharField(max_length=60, verbose_name='备注')
class employeeinfo(models.Model):
phone = models.CharField(max_length=11)
address = models.CharField(max_length=50)