多表外键字段的创建(ORM)
表关系
一对多
多对多
一对一
图书管理系统表设计
图书表
出版社表
作者表
作者详情表
ps:'换位思考'
表关系:
图书表与出版社表
一对多 外键字段建在多的一方
models.Foreignkey(to='publish')
图书表与作者表
多对多 外键字段需要建在第三张关系表
models.ManyToManyFiled(to='Author')
作者表与作者详情表
一对一 外键字段建在任意一方都可以,但推荐建在查询频率高的一方
models.OneToOneField(to='AuthorDetail')
实例:
from django.db import models
# Create your models here.
class Book(models.Model):
title = models.CharField(verbose_name='书名',max_length=32)
# 小数总共8位 小数位占两位
price = models.DecimalField(verbose_name='价格',max_digits=8,decimal_places=2)
# 书与出版社是一对多 并且书是多的一方 外键字段建在数据表中
publish = models.ForeignKey(to='Publish')
"""针对外键字段 orm会自动加_id后缀 如果你加了再继续加_id"""
# 书与作者是多对多 orm不需要你自己建 它自动帮你建
authors = models.ManyToManyField(to='Author') # 告诉orm自动创建第三张关系表
"""虚拟字段 不会在表中展示出来 用于ORM自动创建第三张关系表"""
class Publish(models.Model):
name = models.CharField(verbose_name='出版社名称',max_length=32)
addr = models.CharField(verbose_name='出版社地址',max_length=64)
class Author(models.Model):
name = models.CharField(verbose_name='姓名', max_length=32)
addr = models.CharField(verbose_name='地址', max_length=64)
# 作者与作者详情是一对一 推荐建在查询频率高的
author_detail = models.OneToOneField(to='AuthorDetail')
"""针对外键字段 orm会自动加_id后缀 如果你加了再继续加_id"""
class AuthorDetail(models.Model):
age = models.IntegerField(verbose_name='年龄')
phone = models.BigIntegerField(verbose_name='手机号')
django请求生命周期流程图
![image](https://img2020.cnblogs.com/blog/2327352/202105/2327352-20210519212628462-179463955.png)
路由层
路由匹配
urls.py
url()方法第一个参数其实是一个正则表达式
第一个参数只要能够匹配到内容就算是符合匹配条件直接停止匹配执行视图函数
# 路由匹配
url(r'^test/$',views.test),
url(r'^testadd/$',views.testadd)
# 取消自动加斜杠(默认为True)
APPEND_SLASH = False
无名分组
在路由匹配的时候如果给正则表达式加上了括号
那么匹配到路由之后会将括号内正则表达式匹配的到内容当做位置参数传递给视图函数
url(r'^test/(\d+)/(\d+)/',views.test) # test(request,正则匹配的内容)
有名分组
在路由匹配的时候如果给正则表达式加上了括号并且命名
那么匹配到路由之后会将括号内正则表达式匹配的到内容当做关键字参数传递给视图函数
url(r'^testadd/(?P<user_id>\d+)/',views.testadd) # testadd(request,user_id=正则匹配的内容)
##补充
url(r'^testsub/(\d+)/(?P<sub_id>\d+)/',views.sub)
无名有名分组两者不能混合使用!!!
单独的情况下可以重复多次!!!
url(r'^testsub/(\d+)/(\d+)/')
url(r'^testsub/(?P<sub_id>\d+)/(?P<sub_id>\d+)/')
反向解析
"""
通过别名反向解析到一个结果
该结果可以访问到对应的视图函数
"""
前端页面反向解析
{% url 'index_view' %}
后端流程反向解析
from django.shortcuts import render, HttpResponse, redirect, reverse
def func(request):
# 第一种
_url = reverse('index_view')
print(_url)
# return redirect('/index/')
# 第二种
return redirect('index_view') # 还可以直接写别名
# 起别名不能冲突