defer和only
需求, 一个表有很多很多个字段,如果只要其中的一两个字段 , 那么, 我们只需要取出这一两个字段就可以了, 效率就会提升
defer('id','name'):取出对象,除了id和name的其他字段
only('id','name'):取的对象,只有id和name
如果点,依然能点出其它列,但是不要点了,因为取没有的列,会再次查询数据库
也就是说, 你取出了哪些字段就不要用其他字段了
eg:
ret=models.Author.objects.only('nid')
for i in ret:
# 查询不在的字段,会再次查询数据库,造成数据库压力大
print(i.name)
choice
需求: 性别在数据库里存的是 1 和2 ,其中1代表男,如何跳过 if 判断而直接拿到汉字的男女
在模型层:
先定义:
mychoice=((1,'男'),(2,'女'),(3,'其他'))
在定义性别字段时:
sex = models.IntegerField(choices=mychoice)
在视图层的用法: get_字段名_display()
sex=author.get_sex_display()
inclusion_tag 我叫他动态组件
介绍:
写一个html组件 , 但是里面的数据是动态渲染的 , 我们可以定义一个inclusion_tag , 可以将数据传给这个组件 , 然后在其他模板里需要用到这个组件的时候 load 过来就可以了
1. 在app下创建一个templatetags的文件夹(名字不能改)
2. 在模块下新建一个py文件(名字随意, 如:mytag.py)
3. 在此文件编辑代码
from django.template import Library
register=Library()------>名字必须叫register
使用装饰器:@register.inclusion_tag('test.html') 参数为组件的文件名
写个函数my_inclusion,返回一个字典
4. 在模板中使用:
{% load mytag %}
{% my_inclusion 参数%} 此处可以传参数也可以不传
总结
写一个组件, 里面需要数据, 写一个函数给这个组件传数据, 然后就可以在模板里面使用这个动态组件了
使用实例:
mytag.py
from django.template import Library
from app01 import models
register = Library()
@register.inclusion_tag('test.html') 参数为组件的文件名
def author_tag():
author_list=models.Author.objects.all()
return {'author_list':author_list}
其他模块使用这个组件:
<div>
{% load mytag %}
{% author_tag %}
</div>
事物
from django.db import transaction
with transition.atomic():
sql1
sql2