Django框架(十一)-- 补充:inclusion_tag、defer、only、choice、事务、创建多对多的第三张表、mvc和mtv模式
一、inclusion_tag
1、作用
用于生成HTML片段,是数据由参数传入而变成动态
2、使用
# 1.app下新建一个模块,templatetags # 2.创建一个py文件(mytag.py) # 3.导入Library模块,实例化 from django.template import Library register=Library() # -----> register名字一定不能变 # 4.写装饰器(标签,过滤器,inclusion_tag) @inclusion_tag('模板路径',name='重命名') def my_in(): # 不写,写多个,不写不传,写多个,按空格来传参 # 一堆逻辑处理,查数据库 ret=Book.object.all() return {''books':ret} # 在模板中: 可以用books这个变量,渲染页面 # 5.应用: -在另一个模板中: -{%load mytag.py%} -{% my_in %}
二、defer与only
1、定义
defer ----> 除了指定字段之外
only ----> 只查询几个字段
2、使用
ret=Book.object.all().only('name') # 等价于,id始终都会查 ret=Book.object.all().only('id','name')
3、注意点
ret=models.Author.objects.only('nid') for i in ret: # 查询的name不在的ret中,会再次查询数据库,造成数据库压力大 print(i.name)
三、事务
1、原子性操作
2、语法
from django.db import transition with transition.atomic(): sql1 sql2
四、choice
1、定义
模型表中某个字段,可以指定choice,用在选择不经常变的情况,经常变,尽量用数据库
2、使用
# db_constraint 是否在数据库中创建外键约束,默认为True user_type=models.ForeignKey(to='Info', to_field='id',db_constraint=False) #取出对应的汉字 # author对象.user_type.name mychoice=((1,'男'),(2,'女'),(3,'其他')) # dd = models.ForeignKey(to='Info', to_field='id') #取出对应的汉字 dd = models.ForeignKey(choices=mychoice)
五、多对多创建第三张表
1、多对多的操作
https://www.cnblogs.com/linagcheng/p/9953252.html
2、三种方法创建第三张表
(1)手动创建第三张表(不创建关联关系)
# 手动创建第三张表(不创建关联关系) class Book(models.Model): # 默认会创建id name = models.CharField(max_length=32) class Author(models.Model): name = models.CharField(max_length=32) class Book2Author(models.Model): id = models.AutoField(primary_key=True) book=models.ForeignKey(to='Book',to_field='id') author=models.ForeignKey(to='Author',to_field='id') # 不管是插入和查询,删除,都很麻烦(一般不用)
(2)自动创建第三张表
# 自动创建第三张表 查询,插入,删除,都很方便 缺点:字段是固定的,第三张表如果要添加字段,实现不了
(3)手动创建第三张表,建立关联关系
class Book(models.Model): # 默认会创建id name = models.CharField(max_length=32) # 中介模型,手动指定第三张中间表是 authors=models.ManyToManyField(to='Author',through='Book2Author',through_fields=('book','author')) class Author(models.Model): name = models.CharField(max_length=32) class Book2Author(models.Model): id = models.AutoField(primary_key=True) book=models.ForeignKey(to='Book',to_field='id') author=models.ForeignKey(to='Author',to_field='id') # through:来指定我的第三张表是哪个 # through_fields:('book','author'),第一个值是:从中间表找到设置关联字段的表,通过哪个字段,第一个位置就写它 # 终极总结:防止混了:关联字段就是表名小写,第一个值:就是当前表的表名小写 # 查询,新增,删除,都很方便 # 第三张表,可以添加别的字段