django orm介绍
- 1.什么叫orm
- orm: 对象关系映射
| python | 被映射为 | 数据库 |
|---|---|---|
| 类 | 表 | |
| 对象 | 记录 | |
| 对象点熟悉 | 字段对应的值 |
```
用于实现面向对象编程语言里不同类型系统的数据之间的转换
它其实是创建了一个可在 编程语言 里使用的“虚拟对象数据库”。
通俗的来说:ORM的存在可以让不会MySQL的python程序员 使用python的语法简单快捷的操作MySQL
```
- 2.使用orm创建数据库
- 1.先去应用目录下的model.py编写模型类
# create table userinfo(); class userinfo(models.Model): # 定义了表名 # id int primary key auto_increment id = models.AutoField(primary_key=True) # 相当于定义了主键自增 # name varchar(32) name = models.CharField(max_length=32) # 定义了普通字段 # password int password = models.IntegerField() # 定义了普通字段 # 完整sql语句 # create table userinfo(id int primary key auto_incremwnt,name varchar(32),password int)
- 1.先去应用目录下的model.py编写模型类
我们通过orm写完sql语句后还需要将其同步到数据库中,所以需要执行指令进行迁移同步操作
- 2.数据库迁移/同步命令
1. 将models中有关数据库的操作记录下来(migration文件夹) python38 manage.py makemigrations 2. 将操作影响到数据库 python38 manage.py migrate * 只要models或数据库中的代码发生了变动,都需要执行上述操作命令 * 可能出现的问题 D:\pycharmProjects\housework_django>python38 manage.py makemigrations No changes detected 解决方式: 查看setting中的INSTALLED_APPS app名字是否与自己创建的app一致 python38 manage.py makemigrations appname- 偷懒行为(不建议)
1.只敲关键字 * 导航栏Tools>>>run manage.py Task makemigrations migrate 2.也可以指定应用单独迁移/同步 后面加上app名字就行- 如下图
- 3.表的主键在orm中,可以不写,orm会帮你自动添加一个id的主键
- 自动创建的主键代码上会多auto_created=True,意思为自动创建
在我们需要设置主键名不叫id的主键时就需要自己添加,不能让orm自己创建了orm语法
- 1.在models.py外用orm需要导入
from app01 import models - 2.增
models.表名.objects.create() 结果: userinfo object (2) - 3.查
models.表名.objects.filter() 结果: <QuerySet [<userinfo: userinfo object (1)>]> 列表套对象 * 如何获取对象? 可以使用first()方法,不推荐使用索引,如果没有值会返回None,进行if判断即可. - 4.改
models.表名.objects.filter(id=?).update(name='新名字',password='新密码') - 5.删
models.表名.objects.filter(id=?).delete() - 6.实现得关键代码
后端: from app01 import models def login(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') # 1.查 # select * from userinfo where name='' and password='' res = models.userinfo.objects.filter(name=username, password=password).first() print(res) # <QuerySet [<userinfo: userinfo object (1)>]> 列表套对象 user_obj = res if user_obj: print(user_obj.id) print(user_obj.name) print(user_obj.password) return HttpResponse('登录成功') return HttpResponse('用户名或密码错误') # 2.增 res = models.userinfo.objects.create(name=username,password=password) print(res) return HttpResponse('用户新增成功') # 3.改 models.userinfo.objects.filter(id=2).update(name='hanser',password='666') return HttpResponse('用户信息已修改') # 4.删 models.userinfo.objects.filter(id=1).delete() return HttpResponse('该用户已删除') return render(request, 'my01.html')前端: <div class="container"> <div class="row"> <h1 class="text-center">用户登录</h1> <div class="col-md-6 col-md-offset-3"> <form action="" method="post"> <p>username:<input type="text" name="username" class="form-control"></p> <p>password:<input type="text" name="password" class="form-control"></p> <input type="submit" value="登录" class="btn btn-success btn-block"> </form> </div> </div> </div>
orm外键关联
- 1.mysql中判断表关系
MySQL 一对多 外键字段建在多的一方 多对多 外键字段建在第三张关系表 一对一 外键字段建在查询频率较高的表中 - 2.orm中建外键
我们以下四张表作为例子:出版社表(Publish),书籍表(Book),作者表(Authors),作者详细表(AuthorDetail)
- 1.一对多
外键字段建在多的一方 # 一个出版社可以出版多本数(一对多) publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE) - 2.多对多
外键字段可以直接写在某张表中 orm会自动帮你创建第三张表 # 一本书可以由多个作者编写,一个作者也可以写多本书(多对多) author = models.ManyToManyField(to='Authors') - 3.一对一
外键字段建在查询频率较高的表中 # 作者与作者详情(一对一) authors_message = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE) - 4.一些关键字的意思
on_delete=models.CASCADE 级联删除 OneToOneField 一对一 ManyToManyField 多对多 ForeignKey 一对多 - 5.代码实例
from django.db import models class Book(models.Model): title = models.CharField(max_length=32) # 一个出版社可以出版多本数 一对多 publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE) # 一本书可以由多个作者编写,一个作者也可以写多本书(多对多) author = models.ManyToManyField(to='Authors') class Publish(models.Model): publish_name =models.CharField(max_length=32) class Authors(models.Model): name = models.CharField(max_length=32) # 作者与作者详情(一对一) authors_message = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE) class AuthorDetail(models.Model): ations authors_message =models.BigIntegerField()