像优酷平台网站是怎么做的,小程序商城哪的服务好,建企业网站需要多少钱,重庆最专业的房产网站建设Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475 目录* Django ORM ORM实操之数据库迁移 ORM实操之字段的修改 ORM实操之数据的增删改查 数据库同步 ORM创建表关系
Dja…Python微信订餐小程序课程视频
https://edu.csdn.net/course/detail/36074
Python实战量化交易理财系统
https://edu.csdn.net/course/detail/35475 目录* Django ORM ORM实操之数据库迁移 ORM实操之字段的修改 ORM实操之数据的增删改查 数据库同步 ORM创建表关系
Django请求生命周期流程图 路由匹配无名分组有名分组反向解析 无名分组和有名分组反向解析
Django ORM ORM对象映射关系程序 通过orm将编程语言的对象模型和数据库的关系模型建立映射关系这样我们在使用编程语言对数据库进行操作的时候可以直接使用编程语言的对象模型进行操作就可以了而不用直接使用sql语言 python与MySQL映射关系
Python映射MySQL类-------表对象-------表里面的数据对象点属性-------字段对应的值
ORM实操之数据库迁移
✨我们的模型类需要写在应用下的models.py文件中
# SQL原生语句和ROM创建的区别class User(models.Model):# id int primary key auto\_incrementid models.AutoField(primary_keyTrue)# name varchar(32)name models.CharField(max_length32) # CharField必须要加max\_length参数# age intage models.IntegerField()
✨✨✨数据库迁移命令重点
只要修改了models.py文件执行了和数据库相关的命令就重新执行下面这两条命令python3 manage.py makemigrations、python3 manage.py migrate或者打开Tools点击RUN manage.py Task输入makemigrations 1.将数据库修改操作先记录到本本(对应应用下的migrations文件夹)python3 manage.py makemigrations
# 执行完产生一个文件用来记录
2.真正的执行数据库迁移操作同步到数据库python3 manage.py migrate
# 执行完会在数据库中产生Django所需的依赖表自动创建的
# 自己创建的表user以应用名\_表名的形式创建app01\_user
✨✨不指定id字段和主键等ORM会自动创建id
# 如果你不指定主键 那么orm会自动帮你创建一个名为id的主键字段
class user(models.Model):username models.CharField(max_length32)# 就不用写id了···需要定制id就写上~
ORM实操之字段的修改
# 原来的表
class user(models.Model):username models.CharField(max_length32)# 增加字段两种方法password models.IntegerField(密码,nullTrue) # 该字段可以为空is_delete models.IntegerField(default0) # 默认值# 修改字段
直接改代码然后执行makemigrations数据库迁移
# 删除
直接删除或者注释掉代码然后执行makemigrations数据库迁移
ORM实操之数据的增删改查
查询操作
username request.POST.get(username)
# 获取用户post从页面提交的数据,username是获取到用户提交的数据# 1.查询数据
# select * from user where nameusername;
user_obj_list models.User.objects.filter(nameusername) # 获取到的是列表看成列表套数据对象
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(nameusername).first()
如果用户提交的信息不存在返回None# 登录功能示例
user_check models.User.objects.filter(nameusername,passwordpassword).first() # 等价于select * from user where nameusername and pwd password
if user_check:return HttpResponse(登录成功)
# 2.添加数据
# insert into user(name,pwd) values(username,password);
models.User.objects.create(nameusername,pwdpassword)# 3.查询所有的数据展示所有数据到前端页面通过for循环在html页面获取表数据
# select * from user;
models.User.objects.all() # 返回列表[obj1,obj2,obj3,obj4]# 4.修改数据
models.User.objects.filter(idedit_id).update(nameusername,pwdpassword)
# 或者
edit_obj.name username
edit_obj.pwd password
edit_obj.save()# 5.删除数据
models.User.objects.filter(iddelete_id).delete()
数据库同步
数据库迁移命令链接
python manage.py makemigrations 2. inspectdb 表名语句反向操作数据库反向输出sql语句对应的类
ps如果inspectdb后不跟表名那么就会将该数据库内的所有表反向解析成类python语句
# 数据库里面已经有一些表我们如何通过django orm操作?
1.照着数据库表字段自己在models.py
2.django提供的反向同步操作
1.先执行数据库迁移命令 完成链接python manage.py makemigrations
2.查看代码python manage.py inspectdbclass Userinfo(models.Model):id models.IntegerField(blankTrue, nullTrue)name models.CharField(max_length32, blankTrue, nullTrue)pwd models.IntegerField(blankTrue, nullTrue)class Meta:managed Falsedb_table userinfo
ORM创建表关系
表与表之间的关系有一下三种 一对多、多对多、一对一没关系暂且排外下面演示如何通过ORM来创建外键确立表关系~ ORM创建外键字段的位置
一对多创建在多的一方一堆一创建在任何一方都可以但是推荐创建在查询频率较高的表中多对多两种方式 自己创建第三张表创建在任何一方都可以但是推荐创建在查询频率较高
# 创建书籍表 出版者表 作者表
# 先写表的基本结构在考虑表关系如何写外键# 书籍表
class Book(models.Model):name models.CharField(max_length32)price models.DecimalField(max_digits8, decimal_places2) # 总共8位 小数占2位# 作者外键Author models.ManyToManyField(toAuthor)# 出版社外键Publish models.ForeignKey(toPublish,on_deletemodels.CASCADE)# 作者表
class Author(models.Model):name models.CharField(max_length32)age models.IntegerField()Atuhor_Detail models.OneToOneField(toAtuhor\_Detail,on_deletemodels.CASCADE)# 作者详情表
class Atuhor_Detail(models.Model):phone models.BigIntegerField()Email models.EmailField()# 出版社表
class Publish(models.Model):name models.CharField(max_length32)address models.CharField(max_length32)
注意
外键不需要写id会自动添加id比如author_id不需要写_idorm自动补充 ORM自动创建书籍和作者的第三张表只有多对多关系表被单独创建出来 外键被当作虚拟字段创建表完成后不会实例化出来而是告诉了ORM创建第三张表的关系Django2.0版本以上在创建外键和一对一关系的时候需要添加级联更新参数on_deletemodels.CASCADE不然会报错只有OneToOneField和ForeignKey需要写ManyToManyField不需要
# django 升级到2.0之后,表与表之间关联的时候,必须要写on\_delete参数,否则会报异常:
# TypeError: init() missing 1 required positional argument: ‘on\_delete’Atuhor_Detail models.OneToOneField(toAtuhor\_Detail,on_deletemodels.CASCADE)
Publish models.ForeignKey(toPublish,on_deletemodels.CASCADE)
Django请求生命周期流程图 路由匹配
路由通俗理解为除去ip和port之后的地址
path官网文档
URL调度
“江狗” 在新版本***Django2.x***中url的路由表示用path和re_path代替 模块的导入由django1.x版本的from django.conf.urls import url,include变成现在的Django2.x中的from django.urls import path, re_path, include Django提供了两种设计URL的方法: path和re_path它们均支持向视图函数或类传递参数。path是正常参数传递re_path是采用正则表达式regex匹配
path方法采用双尖括号变量类型:变量名或变量名传递例如, 或。re_path方法: 采用命名组(?P变量名表达式)的方式传递参数。path支持匹配的数据类型只有str,int, slug, uuid四种。一般来说re_path更强大但写起来更复杂一些 简单示例 urls.py
from django.contrib import admin
from django.urls import path,re_path,include
from app01 import viewsurlpatterns [# 路由匹配re_path(rtest,views.test),re_path(rtestadd,views.testadd)
]views.py
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
def test(request):return HttpResponse(from test)
def testadd(request):return HttpResponse(from testadd)
这样匹配的话相当于使用正则表达式如果url后面写test返回fromtest那么再写testadd呢也会返回from test这是一种包含关系需要更明确的去区别比如写test/,或者testadd/,建议在末尾加上/
urlpatterns [path(admin/, admin.site.urls),# 限制开头re_path(r^test/,views.test),# 限制开头和结尾re_path(r^testadd/$,views.testadd)
]
Django特性如果在url后面写路径没有写/那么会自动补充/相当于跳转页面如果不想使用该特性可以在setting.py文件中取消APPEND_SLASH False 下例中我们分别以path和re_path 定以了两个urls它们是等效的把文章的id(整数类型)传递给了视图。re_path里引号前面的小写r表示引号里为正则表达式, ^代表开头$代表以结尾\d代表正整数
# blog/urls.py
from django.urls import path, re_path
from . import viewsurlpatterns [path(blog/articles//, views.article_detail, name article\_detail),re_path(r^blog/articles/(?P\d)/$, views.article_detail, namearticle\_detail),
]# blog/views.py
def article\_detail(request, id):# 展示某篇文章
在使用path和re_path方法设计urls需注意
url中的参数名要用尖括号而不是圆括号匹配模式的最开头不需要添加斜杠/但建议以斜杠结尾;使用re_path时不一定总是以$结尾有时不能加。比如下例中把blog.urls通过re_path加入到项目urls中时就不能以$结尾因为这里的blog/并不是完整的url只是一个开头而已。
from django.urls import include, re_pathurlpatterns [re_path(r^blog/, include(blog.urls)),...
]
无名分组 涉及到urls.py写对应关系无名分组后如果不给视图函数传参那么就会报错 通俗理解路由使用正则正则匹配加括号分组当作了视图函数的第二个位置参数 urls.pyfrom django.contrib import admin
from django.urls import path,re_path,include
from app01 import viewsurlpatterns [path(admin/, admin.site.urls),# 匹配数字# re\_path(r^test/[0-9]{4}/$,views.test),# 无名分组匹配1个到多个正整数re_path(r^test/(\d)/$,views.test),
]views.py
def test(request,num):print(num) # 1234return HttpResponse(from test)路由使用正则正则匹配加括号分组当作了视图函数的第二个位置参数
有名分组 在使用路由的时候正则表达式可以起别名别名当作关键字参数传给视图函数 没有按关键字参数写报错 按别名传参 urls.py
urlpatterns [
re_path(r^test/(?P\d)/$,views.test),
]
views.py
def test(request,id):print(id)return HttpResponse(from test)# 有名分组将匹配到的数字命名成id当成关键字参数传给视图函数
注意
无名分组和有名分组不能混合使用
re_path(r^test/(\d)/(?P\d)/$,views.test)
def test(request,a,id):print(a,id)return HttpResponse(from test)# 这样不可以
相同分组可以混合使用
re_path(r^testadd/(\d)/(\d)/$,views.testadd)
def testadd(request,*args,**kwargs):return HttpResponse(from testadd)# 这样使用相同分组是可以的
反向解析
反向解析解决了当路由频繁变化的时候html界面上的连接地址实现动态解析
urls.py
# 1、给路由与视图函数对应关系添加一个别名
from django.contrib import admin
from django.urls import path,re_path,include
from app01 import viewsurlpatterns [path(admin/, admin.site.urls),# 反向解析path(index/,views.index,nameindex\_name),path(home/,views.home)
]views.py
from django.shortcuts import HttpResponse,render,reversedef index(request):return HttpResponse(from index)def home(request):print(reverse(index\_name))# 或者# return redirect(index\_name)return render(request,home.html)home.html
a href{% url index\_name %}111/a
a href{% url index\_name %}111/a
a href{% url index\_name %}111/a
总结
当路由频繁变化的时候,html界面上的连接地址如何做到动态解析
# 1.给路由与视图函数对应关系添加一个别名(名字自己指定 只要不冲突即可)url(r^index/,views.index,nameindex\_name)
# 2.根据该别名动态解析出一个结果该结果可以直接访问到对应的路由前端a href{% url index\_name %}111/a后端from django.shortcuts import reversereverse(index\_name)ps:redirect括号内也可以直接写别名
无名分组和有名分组反向解析 如果有分组的情况不写数字参数会报错 路由
urlpatterns [path(admin/, admin.site.urls),# 反向解析re_path(rindex/(\d)/,views.index,nameindex\_name),path(home/,views.home)
]
后端
def index(request):return HttpResponse(from index)
def home(request):print(reverse(index\_name))return render(request,home.html)
前端
a href{% url index\_name %}111/a 无名分组反向解析
# 无名分组
1、起别名
url(r^index/(\d)/,views.index,nameindex\_name)
2、前端
a href{% url index\_name 1 %}/a # 只要给个数字即可
3、后端
reverse(index\_name,args(1,)) # 只要给个数字即可
有名分组反向解析
# 无名分组
1、起别名
url(r^index/(?P\d)/,views.index,nameindex\_name)
2、前端
a href{% url index\_name id1 %}/a # 只要给个数字即可
3、后端
reverse(index\_name,kwargs{id:1}) # 只要给个数字即可
总结
再次验证了分组对应传的参数无名对应位置参数有名对应关键字参数分组了一定要记得传参数无名分组传位置参数有名分组传关键字参数需要注意的是django2.0版本的变化path和re_path写路由django1.0版本用到的是url写路由在前端页面写反向解析的时候用到的是url和Django1.0一样一定要区别开来上面用参数用数字代替在实际应用中经常使用数据主键值视图函数的参数
def index(request,id):return render(request,home.html)# id一般是获取到的主键值 参考文献大江狗