数据库同步命令(了解)
"""
数据库里面已经有一些表,我们如何快速通过django orm操作补全表的代码?
1.照着数据库表字段自己在models.py
数据需要自己二次同步
2.django提供的反向同步
"""
1.先执行数据库迁移命令 完成链接
python manage.py makemigrations
2.查看代码
python manage.py inspectdb 表名 (如果不加表明那么所有表的代码都会解析出)
class Userinfo(models.Model):
id = models.IntegerField(blank=True, null=True)
name = models.CharField(max_length=32, blank=True, null=True)
pwd = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'userinfo'
orm创建外键关系
"""
1.表与表之间的关系
一对多
一对一
多对多
2.表关系的判断
换位思考
"""
书籍表
出版社表
作者表
# ORM针对外键字段的创建位置
一对多
推荐建在多的一方
一对一
建在任何一方都可以,但是推荐建在查询频率较高的表中
多对多
1.自己建表
2.建在任何一方都可以,但是推荐建在查询频率较高的表中
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(max_digits=8,decimal_places=2) # 总共8位 小数占2位
# 出版社外键
publish = models.ForeignKey(to='Publish') # 默认就是主键
"""自动在外键字段后面加_id后缀"""
# 作者外键
authors = models.ManyToManyField(to='Author') # 自动帮你创建书籍和作者的第三张表
"""虚拟字段不会在表中实例化出来 而是告诉ORM创建第三张关系表"""
class Publish(models.Model):
title = models.CharField(max_length=32)
email = models.EmailField()
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
author_detail = models.OneToOneField(to='AuthorDetail')
"""自动在外键字段后面加_id后缀"""
class AuthorDetail(models.Model):
phone = models.BigIntegerField()
addr = models.CharField(max_length=128)
django请求生命周期流程图
路由层之路由匹配
"""路由可以看成就是除去ip和的port之后的地址"""
url()方法
1.第一个参数其实是一个正则表达式
2.一旦第一个参数匹配到了内容直接结束匹配 执行对应的视图函数
url(r'^test/$',views.test)
无名分组
url(r'^test/\d+/$',views.test)
# 正则表达式分组:给正则表达式前后加一个小括号
url(r'^test/(\d+)/$',views.test)
"""
无名分组
将括号内正则表达式匹配到的内容当做位置参数传递给后面的视图函数
"""
有名分组
url(r'^testadd/(?P<id>\d+)/$',views.testadd)
"""
有名分组
将括号内正则表达式匹配到的内容当做关键字参数传递给后面的视图函数
"""
是否可以结合使用
url(r'^test1/(\d+)/(?P<id>\d+)/$',views.test1)
1.无名有名分组不能混合使用
url(r'^test2/(\d+)/(\d+)/$',views.test2),
url(r'^test2/(?P<id>\d+)/(?P<id1>\d+)/$',views.test2)
2.可以单个重复使用
反向解析
当路由频繁变化的时候,html界面上的连接地址如何做到动态解析
# 1.给路由与视图函数对应关系添加一个别名(名字自己指定 只要不冲突即可)
url(r'^index/',views.index,name='index_name')
# 2.根据该别名动态解析出一个结果,该结果可以直接访问到对应的路由
前端
<a href="{% url 'index_name' %}">111</a>
后端
from django.shortcuts import reverse
reverse('index_name')
ps:redirect括号内也可以直接写别名
无名有名反向解析
url(r'^index/(\d+)/',views.index,name='index_name')
后端
reverse('index_name',args=(1,)) # 只要给个数字即可
前端
<a href="{% url 'index_name' 1 %}"></a> # 只要给个数字即可
url(r'^index/(?P<id>\d+)/',views.index,name='index_name')
后端
reverse('index_name',kwargs={'id':123}) # 只要给个数字即可
前端
<a href="{% url 'index_name' id=666 %}"></a> # 只要给个数字即可
总结
无名有名都可以使用一种(无名)反向解析的形式