orm创建表关系和django请求生命周期流程图 (3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | """ 表与表之间的关系 一对多 多对多 一对一 没有关系 判断表关系的方法:换位思考 """ 图书表 出版社表 作者表 作者详情表 """ 图书和出版社是一对多的关系 外键字段建在多的那一方 book 图书和作者是多对多的关系 需要创建第三张表来专门存储 作者与作者详情表是一对一 """ from django.db import models # Create your models here. # 创建表关系 先将基表创建出来 然后再添加外键字段 class Book(models.Model): title = models.CharField(max_length = 32 ) price = models.DecimalField(max_digits = 8 ,decimal_places = 2 ) # 总共八位 小数点后面占两位 """ 图书和出版社是一对多 并且书是多的一方 所以外键字段放在书表里面 """ publish = models.ForeignKey(to = 'Publish' ) # 默认就是与出版社表的主键字段做外键关联 """ 如果字段对应的是ForeignKey 那么会orm会自动在字段的后面加_id 如果你自作聪明的加了_id那么orm还是会在后面继续加_id 后面在定义ForeignKey的时候就不要自己加_id """ """ 图书和作者是多对多的关系 外键字段建在任意一方均可 但是推荐你建在查询频率较高的一方 """ authors = models.ManyToManyField(to = 'Author' ) """ authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系 让orm自动帮你创建第三张关系表 """ class Publish(models.Model): name = models.CharField(max_length = 32 ) addr = models.CharField(max_length = 32 ) class Author(models.Model): name = models.CharField(max_length = 32 ) age = models.IntegerField() """ 作者与作者详情是一对一的关系 外键字段建在任意一方都可以 但是推荐你建在查询频率较高的表中 """ author_detail = models.OneToOneField(to = 'AuthorDetail' ) """ OneToOneField也会自动给字段加_id后缀 所以你也不要自作聪明的自己加_id """ class AuthorDetail(models.Model): phone = models.BigIntegerField() # 或者直接字符类型 addr = models.CharField(max_length = 32 ) """ orm中如何定义三种关系 publish = models.ForeignKey(to='Publish') # 默认就是与出版社表的主键字段做外键关联 authors = models.ManyToManyField(to='Author') author_detail = models.OneToOneField(to='AuthorDetail') ForeignKey OneToOneField 会自动在字段后面加_id后缀 """ # 在django1.X版本中外键默认都是级联更新删除的 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # 路由匹配 url(r 'test' ,views.test), url(r 'testadd' ,views.testadd) """ url方法第一个参数是正则表达式 只要第一个参数正则表达式能够匹配到内容 那么就会立刻停止往下匹配 直接执行对应的视图函数 你在输入url的时候会默认加斜杠 django内部帮你做到重定向 一次匹配不行 url后面加斜杠再来一次 """ # 取消自动加斜杠 APPEND_SLASH = False / True # 默认是自动加斜杠的 urlpatterns = [ url(r '^admin/' , admin.site.urls), # 首页 url(r '^$' ,views.home), # 路由匹配 url(r '^test/$' ,views.test), url(r '^testadd/$' ,views.testadd), # 尾页(了解) url(r'',views.error), ] |
1 2 3 4 5 6 7 8 | """ 分组:就是给某一段正则表达式用小括号扩起来 """ url(r '^test/(\d+)/' ,views.test) def test(request,xx): print (xx) return HttpResponse( 'test' ) # 无名分组就是将括号内正则表达式匹配到的内容当作位置参数传递给后面的视图函数 |
"""
可以给正则表达式起一个别名
"""
url(r'^testadd/(?P<year>\d+)',views.testadd)
def testadd(request,year):
print(year)
return HttpResponse('testadd')
# 有名分组就是将括号内正则表达式匹配到的内容当作关键字参数传递给后面的视图函数
1 2 3 4 5 6 7 8 9 | # 通过一些方法得到一个结果 该结果可以直接访问对应的url触发视图函数 # 先给路由与视图函数起一个别名 url(r '^func_kkk/' ,views.func,name = 'ooo' ) # 反向解析 # 后端反向解析 from django.shortcuts import render,HttpResponse,redirect,reverse reverse( 'ooo' ) # 前端反向解析 <a href = "{% url 'ooo' %}" > 111 < / a> |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!