• Django框架(十二)—— 补充:inclusion_tag、defer、only、choice、事务、创建多对多的第三张表


    补充:inclusion_tag、defer、only、choice、事务、创建多对多的第三张表

    一、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'),第一个值是:从中间表找到设置关联字段的表,通过哪个字段,第一个位置就写它
    # 终极总结:防止混了:关联字段就是表名小写,第一个值:就是当前表的表名小写
        # 查询,新增,删除,都很方便
        # 第三张表,可以添加别的字段
        
    博客内容仅供参考,部分参考他人优秀博文,仅供学习使用
  • 相关阅读:
    vue中使用ztree时报找不到init方法错的解决方案
    element-ui 自定义表单验证 , 但是不出现小红心解决方案
    iframe子页面与父页面之间通信
    GSS系列题解——最大子段和系列
    平衡树 区间树 学习
    数据结构:从入门到精通
    后缀数组
    2019元旦总结,迎接2019
    网络流+费用流 学习
    SLT学习——leafes tree扩展 【文艺平衡树】
  • 原文地址:https://www.cnblogs.com/zhuzhiwei-2019/p/10779153.html
Copyright © 2020-2023  润新知