defer和only和choice和inclusion_tag和事物

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}

其他模块使用这个组件:

{% load mytag %} {% author_tag %}

事物

    from django.db import transaction
    with transition.atomic():
        sql1
        sql2

你可能感兴趣的:(defer和only和choice和inclusion_tag和事物)