Django-ORM
目录
-定义
ORM:对象关系映射
作用:让不懂SQL语句的人也能通过写python代码操作数据库
优势:操作语法简单,提高开发效率
不足:封装程度高,有时SQL语句效率低,需要自己写
ORM会将写的类映射成表,对象映射成记录,对象属性=》某个字段
-使用方法
--models.py
1、去应用文件夹下的model.py中写类,必须继承model.Model
class userinfo02(models.Model): id = models.AutoField(primary_key = True, verbose_name = '主键') # verbose_name字段的解释信息 # id int primary_key auto_increment name = models.CharField(max_length=16, verbose_name= '姓名') # name varchar(16) 必须指定max_length password = models.IntegerField(verbose_name= '密码') # password int
--数据库迁移命令
2、数据库迁移命令
python manage.py makemigrations # 自动将迁移记录记录到应用文件夹下的migrations文件夹下
但此时还未在MySQL中创建,还需执行以下命令↓
python manage.py migrate # 真正在MySQL中创建数据库,且一次性会产生很多表
有些是Django默认产生的表,我们自己创建的表会自动加上app名前缀,以便区分
-- 注意
只要修改了model.py文件下的有关数据库的数据/代码,就必须重写执行数据库迁移命令,没有捷径
-实际操作
--ORM实现字段的增删改查
1、字段的增
直接在类下增加字段代码即可,但倘若一些字段已经有值了而去新增字段:
①在终端选择提供默认值
选择1,然后回车后叫你输入默认值,比如输入18,则迁移后会在数据库中看到字段增加了age且默认值为18
②直接设置字段参数null = True
info = models.CharField(max_length=32, verbose_name='简介', null=True③直接设置字段的默认值
hobby = models.CharField(max_length=16, verbose_name='爱好', default='study')
2、字段的删
就把类下的字段注释掉或删掉,再执行数据库迁移命令即可
但删掉后字段的数据就没了,所以一定要细心,不要随意删或注释
3、字段的改
直接在类下修改字段即可,不过改完一定执行数据库迁移命令
4、字段的查
随便看呗
--ORM实现数据的增删改查
1、数据的增
# 第一种方式 models.userinfo02.objects.create(name=username, password=password) # 第二种方式 user_obj = models.userinfo02(name=username, password=password) user_obj.save() # example-注册 def reg(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') from App01 import models # 必不能忘 # 第一种方式↓ # res = models.userinfo02.objects.create(name=username, password=password) # print(res, res.name, res.password) # 第二种方式↓ user_obj = models.userinfo02(name=username, password=password) user_obj.save() return HttpResponse('注册成功') return render(request, 'html05 register_and_mysql.html')
2、数据的删
# 拿到要删除的对象id delete_id = request.GET.get('user_id') # 删除数据 models.userinfo02.objects.filter(id=delete_id).delete() """ 上述↑代码其实可以批量删除 当传入id多时 """
3、数据的改
# 修改数据方式1 models.userinfo02.objects.filter(id=user_id).update(name=name, password=password) """可批量更新 当传入id多个时""" # 修改数据方式2 data_querySet = models.userinfo02.objects.filter(id=user_id).first() data_querySet.name = name data_querySet.password = password data_querySet.save()
4、数据的查
def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # print(username, password) from App01 import models # 最好写在最上面,这是为了介绍 """ res = models.userinfo02.objects.filter(name = username, password=password) # 等价于select * from userinfo02 where name = username and password = password # print(res) user_obj = res[0] # 返回一个列表套数据对象[数据对象1,数据对象2,…],用索引0取该对象 但不支持负索引 """ user_obj = models.userinfo02.objects.filter(name=username, password=password).first() # 直接调用封装好的方法得到该对象 if user_obj.name == username: if user_obj.password == password: return HttpResponse('登录成功') else: return HttpResponse('密码错误') else: return HttpResponse('用户不存在') return render(request, 'html04 login_and_mysql.html')
--ORM创建表与表之间的联系
创建表关系,先将基表创建出来,然后再添加外键字段
class Book(models.Model): title = models.CharField(max_length=32) price = models.DecimalField(max_digits=5, decimal_places=2) # 总共5位,小数占2位 # 外键字段 publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE) ''' 图书和出版社是一对多,外键字段写在多的一方 默认就是和出版社表的主键字段做关联 如果字段对应的是ForeignKey,那么orm会自动在字段后面加_id,后面我们在定义ForeignKey时就不要加_id ''' authors = models.ManyToManyField(to='Author') ''' 图书和作者多对多,外键推荐写在查询频率高的一方 authors是一个虚拟字段,用于告诉orm是多对多关系,orm自动帮你创建第三章表 ''' class Publish(models.Model): name = models.CharField(max_length=32) address = models.CharField(max_length=64) class Author(models.Model): name = models.CharField(max_length=32) age = models.IntegerField() # 外键字段 author_detail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE) ''' 作者与作者详情表是一对一关系,外键字段推荐建在查询频率高的一方 OneToOneField也会自动给外键字段加_id后缀 ''' class AuthorDetail(models.Model): phone = models.CharField(max_length=11) address = models.CharField(max_length=32) email_add = models.EmailField()