Django ORM
Django ORM#
ORM: 对象映射关系程序
通过orm将编程语言的对象模型和数据库的关系模型建立映射关系,这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了,而不是直接使用sql语言。
python与MySQL映射关系
Python | 映射 | MySQL |
---|---|---|
类 | ---> | 表 |
对象 | ---> | 表里面的数据 |
对象点属性 | ---> | 字段对应的值 |
ORM实操之数据库迁移#
我们的模型类需要卸载应用下的models.py文件中
from django.db import models
# Create your models here.
class User(models.Model):
# id int primary key auto_increment
id = models.AutoField(primary_key=True)
# name varchar(32)
name = models.CharField(max_length=32) # 参数必须跟上max_len
# age int
age = models.IntegerField()
数据库的迁移命令
- 只要修改了models.py文件执行了数据库相关的命令,就要重新执行下面两条命令:python36 manage.py makemigrations、python36 manage.py migrate
- 或者打开Tools,点击RUN manage.py Task,输入makemigrations
1.将数据库修改操作先记录在'本本'(对应的migrations文件夹中)
python36 manage.py makemigrations
2.真正的执行数据库迁移操作,同步到数据库
python36 manage.py migrate
# 自己创建的表user以'应用名_表名'的形式创建,app01_user=
不指定id字段 那么orm会自动创建id字段
# 如果不指定主键,那么orm会自动创建一个名为id的主键字段
class user(model.Model):
username = model.CharField(max_length=32)
ORM实操之字段的修改#
# 原来的表
class user(model.Model):
username = model.CharField(max_length=32)
# 增加字段(两种方法)
password = model.IntegerField('密码',null=True) # 该字段可以为空
is_delete = models.IntegerField(default=0) # 默认值
# 修改字段
直接改代码,然后执行makemigrations,数据库迁移
# 删除
同上
ORM实操之数据的增删改查#
username = request.POST.get('username')
# 获取用户post从页面提交的数据,username是获取到用户提交的数据
# 1.查询数据
# select * from user where name=username;
user_obj_list = models.User.objects.filter(name=username) # 获取到的是列表,看成列表套数据对象
obj_info = user_obj_list[0]
# 获取id、name、age
print(obj_info.id,
obj_info.name,
obj_info.age) # 1 hammer 18
# 或这下面这样提取列表数据也可以
user_obj = models.User.objects.filter(name=username).first()
'''如果用户提交的信息不存在返回None'''
# 登录功能示例
user_check = models.User.objects.filter(name=username,password=password).first() # 等价于select * from user where name=username and pwd = password
if user_check:
return HttpResponse('登录成功')
# 2.添加数据
# insert into user(name,pwd) values(username,password);
models.User.objects.create(name=username,pwd=password)
# 3.查询所有的数据,展示所有数据到前端页面,通过for循环在html页面获取表数据
# select * from user;
models.User.objects.all() # 返回列表[obj1,obj2,obj3,obj4]
# 4.修改数据
models.User.objects.filter(id=edit_id).update(name=username,pwd=password)
# 或者
edit_obj.name = username
edit_obj.pwd = password
edit_obj.save()
# 5.删除数据
models.User.objects.filter(id=delete_id).delete()
数据库同步#
数据库迁移命令,python manage.py makemigrations
inspectdb 表名 反向操作数据库,反向输出sql语句对应的类
如果inspectdb后不跟表名,那么就会将该数据库内的所有表反向解析成类(python语句)
操作:
1.先执行数据库迁移命令 完成链接
python manage.py makemigrations
2.查看代码
python manage.py inspectdb
class AuthUser(models.Model):
password = models.CharField(max_length=128)
last_login = models.DateTimeField(blank=True, null=True)
is_superuser = models.IntegerField()
username = models.CharField(unique=True, max_length=150)
first_name = models.CharField(max_length=150)
last_name = models.CharField(max_length=150)
email = models.CharField(max_length=254)
is_staff = models.IntegerField()
is_active = models.IntegerField()
date_joined = models.DateTimeField()
class Meta:
managed = False
db_table = 'auth_user'
ORM创建表关系#
表与表之间的关系有以下三种
一对一、一对多、多对多
ORM创建外键字段的位置
- 一对多: 创建在多的一方
- 一对一: 创建在任意一方都可以,建议创建在使用频率高的一方
- 多对多: 可以选择创建第三张表,也可以建在使用频率高的一方
from django.db import models
# Create your models here.
class Book(models.Model):
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2) # 总共8位,小数部分占2位
# 作者外键
Publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
# 作者表
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
Author_Detail = models.OneToOneField(to='Author_Detail',on_delete=models.CASCADE)
# 作者详情表
class Author_Detail(models.Model):
phone = models.BigIntegerField()
Email = models.EmailField()
# 出版社表
class Publish(models.Model):
name = models.CharField(max_length=32)
address = models.CharField(max_length=32)
注意
- 外键不需要写id,会自动添加id,比如author_id,不需要写_id,orm自动补充
- orm自动创建书籍和作者的第三张表,只有多对多关系表被单独创建出来
- 外键被当做虚拟字段,创建表完成后,不会实例化出来,而是告诉orm创建第三张表的关系
- django2.0版本以上,在创建外键和一对一关系的时候,需要添加级联更新参数on_delete = model.CASCADE,不然报错,只有OneToOneField和F哦reignKey需要这样写,ManyToManyField不需要
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!