zoukankan      html  css  js  c++  java
  • 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'),第一个值是:从中间表找到设置关联字段的表,通过哪个字段,第一个位置就写它
    # 终极总结:防止混了:关联字段就是表名小写,第一个值:就是当前表的表名小写
        # 查询,新增,删除,都很方便
        # 第三张表,可以添加别的字段
  • 相关阅读:
    dotnet 新项目格式与对应框架预定义的宏
    dotnet 线程静态字段
    dotnet 线程静态字段
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取系统信息
    dotnet 通过 WMI 获取系统信息
    PHP show_source() 函数
  • 原文地址:https://www.cnblogs.com/zhangbingsheng/p/10663307.html
Copyright © 2011-2022 走看看