Django之ORM
单表查询
1. 什么是ORM?
关系映射对象
# 不但在python中有,在其他语言中也有
2. 特点:
在操作数据库的时候,不用在写原生SQL语句
'''相对而言,执行效率低了'''
3. ORM书写的位置:
在models.py文件中
4. 如何使用?
类名 >>> 表名
对象 >>> 记录
属性 >>> 字段
表的创建
from django.db import models
# 创建一张表出来,必须继承models class User(models.Model): # 组合索引,联合索引 # id int primary key auto_increment id = models.IntegerField(primary_key=True) # username, max_length必须写 username = models.CharField(max_length=32) # varchar(32) # password, orm支持自定义数据类型 password = models.CharField(max_length=32) # char()
补充:ORM不能创建数据库,必须提前把库创建完成
数据迁移
类写完之后,一定要执行数据库迁移命令,才能真正的创建出来数据表
python manage.py makemigrations python manage.py migrate
注意:凡是跟数据相关的操作都要执行以上两句话
第二种方式
只需要书写makemigrations和migrate两个命令,分别执行即可
记录的增删改查
增:直接增加,添加完成之后执行数据迁移命令就可以
删:直接注释,再执行数据迁移命令就可以,需注意,这样做之后原来的数据也会跟着丢失。
改:直接更改,更改完成之后执行数据迁移命令就可以
查:直接看
字段的增删改查
增:
第一种
res = models.User.objects.create(username='ys', password=123) print(res.username)
第二种
obj = models.User(username='ys', password=123) obj.save()
查
第一种查全部
res = models.User.objects.filter().all()
第二种
res = models.User.objects.filter(pk=1).first()
frist的原理
pk=1就相当于id=1
改
第一种
models.User.objects.filter(id=1).update(username='YS')
# 可以写成pk
models.User.objects.filter(pk=1).update(username='YS')
第二种
res = models.User.objects.filter(pk=1,username='aaa').first() # 查 # 返回值是个对象,列表 print(res) print(res.username) print(res.password) res.username ='aaa' # 第二种 res.save()
删
models.User.objects.filter(pk=1).delete()
网页增删改查练习
models.py文件
from django.db import models # Create your models here. class User(models.Model): id = models.AutoField(primary_key=True, verbose_name='主键') username = models.CharField(max_length=32, verbose_name='用户名') # password = models.IntegerField(verbose_name='密码') password = models.CharField(verbose_name='密码', max_length=64)
views.py文件
def home(request): user_list = models.User.objects.all() return render(request, 'home.html', locals()) # 添加数据 def add(request): if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') models.User.objects.create(username=username, password=password) return redirect('/home/') return render(request, 'add.html') # 修改数据 def edit(request): id = request.GET.get('id') edit_obj = models.User.objects.filter(pk=id).first() if request.method == 'POST': username = request.POST.get('username') password = request.POST.get('password') models.User.objects.filter(pk=id).update(username=username, password=password) return redirect('/home') return render(request, 'edit.html', locals()) # 删除数据 def delete(request): id = request.GET.get('id') models.User.objects.filter(pk=id).delete() return redirect('/home/')
urls.py文件
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index), url(r'^home/', views.home), url(r'^add/', views.add), url(r'^edit/', views.edit), url(r'^delete/', views.delete), ]
add.html
<div class="container"> <div class="row"> <h1 class="text-center">添加数据</h1> <form action=""method="post"> <div class="form-group">username: <input type="text" name="username" class="form-control"> </div> <div class="form-group">password: <input type="password" name="password" class="form-control"> </div> <input type="submit" value="提交" class="btn btn-success btn-block"> </form> </div> </div>
edit.html
<div class="container"> <div class="row"> <h1 class="text-center">删除数据</h1> <form action=""method="post"> <div class="form-group">username: <input type="text" name="username" class="form-control" value="{{ edit_obj.username }}"> </div> <div class="form-group">password: <input type="password" name="password" class="form-control" value="{{ edit_obj.password }}"> </div> <input type="submit" value="提交" class="btn btn-success btn-block"> </form> </div> </div>
home.py
<div class="container"> <div class="row"> <h1 class="text-center">列表展示页</h1> <a href="/add/" class="btn btn-success btn-lg">添加数据</a> <table class="table table-striped table-hover"> <thead> <tr> <th>id</th> <th>username</th> <th>password</th> <th>操作</th> </tr> </thead> <tbody> {% for user in user_list %} <tr> <td>{{ user.id }}</td> <td>{{ user.username }}</td> <td>{{ user.password }}</td> <td> <a href="/edit/?id={{ user.id }}" class="btn btn-primary">修改</a> <a href="/delete/?id={{ user.id }}" class="btn btn-danger">删除</a> </td> </tr> {% endfor %} </tbody> </table> </div> </div>
ORM创建表关系
1、一对多
外键字段建在多的一方
publish_id = models.ForeignKey(to='关联表明') # 如果关联的是id字段,那么可以省略不写
2、多对多
外键字段不建在任何一张表,而是,建在第三张表中
authors = models.ManyToManyField(to='关联表明')
# authors是一个虚拟字段,不会真正的在book表中创建出来这个字段,这个字段是关联第三张表的
3、一对一
外键字段建在任何一方都可以,但是,推荐建在使用频率比较高的一张表
author_detail = models.OneToOneField(to='关联表明')
END