目录
-定义
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()