• 模型层补充


    模型层补充

    一、IntegerField中choices参数

    在数据库中往往有一些,几个固定结果的字段,比如,姓名男女,这是就可以用choices参数,对指定字段在数据库中存储

    # models.py
    class Userinfo(models.Model):
        username = models.CharField(max_length=30)
        password = models.CharField(max_length=30)
    	
        choices = (
            (1, 'male'),
            (2, 'female'),
        )
         """
        1. 如果存在上面元组中数字会取出什么值
        2. 如果存的数字不在元组范围内,会取出什么值
           数字没有对应关系也可以存
        """
        gender = models.IntegerField(choices=choices)
        
    
    
    
    # 数据库中数据
    1	randy	 123	1
    2	老王	 324	2
    3	小王	 234	3
    #test.py
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ajax.settings")
        import django
    
        django.setup()
    
        from app import models
        user_obj = models.Userinfo.objects.filter(pk=1).first()
        print(user_obj.username)
        print(user_obj.password)
        # 针对choices字段,如果你想要获取数字对应的中文,你不能直接点字段
        # 固定句式 数据对象.get_字段名_display() 当没有对应关系的时候,该句式获取到的还是数字
        print(user_obj.get_gender_display())
    

    randy
    123
    male

    总结:

    • 固定获取对应字段方式,数据对象.get_字段名_display()
    • 获取gender值与choise对应,则获取与之对应的字段值,如果不存在则返回本身的值
    • 可以存在choise没有队形的字段

    例如:

      
    record_choices = (('checked', "已签到"),
                      ('vacate', "请假"),
                      ('late', "迟到"),
                      ('noshow', "缺勤"),
                      ('leave_early', "早退"),
                     )
    record = models.CharField("上课纪录", choices=record_choices, default="checked", 
        
    
    score_choices = ((100, 'A+'),
                    (90, 'A'),
                     (85, 'B+'),
                     (80, 'B'),
                     (70, 'B-'),
                     (60, 'C+'),
                     (50, 'C'),
                     (40, 'C-'),
                     (0, ' D'),
                      (-1, 'N/A'),
                      (-100, 'COPY'),
                      (-1000, 'FAIL'),
                    )
    score = models.IntegerField("本节成绩", choices=score_choices, default=-1)
    

    二、bulk_create插入数据

    1.create插入数据

    <body>
    {% for user_obj  in user_all %}
        <p>{{ user_obj.username }}</p>
    {% endfor %}
    </body>
    
    # urls.py
    from app01 import views
    urlpatterns = [
        url(r'^insert/', views.insert),
    ]
    # views.py
    from app01 import models
    import time
    def insert(request):
        start = time.time()
        # 向用户插入1000条数据
        for i in range(1000):
            models.Userinfo.objects.create(username=f'name{i}')
        end = time.time()
        print(start - end)
        user_all = models.Userinfo.objects.all()
        return render(request, '01insert.html', locals())
    

    消耗时间:89.44472026824951

    2.bulk_create插入数据

    <body>
    {% for user_obj  in user_all %}
        <p>{{ user_obj.username }}</p>
    {% endfor %}
    </body>
    
    # urls.py
    from app01 import views
    urlpatterns = [
        url(r'^insert/', views.insert),
    ]
    # views.py
    from app01 import models
    import time
    def insert(request):
        start = time.time()
        user_list = []
        # 向用户插入1000000条数据    
        for i in range(1000000):
            user_list.append(models.Userinfo(username=f'name{1}'))
        models.Userinfo.objects.bulk_create(user_list) # 批量插入数据
        end = time.time()
        print(end - start)
        user_all = models.Userinfo.objects.all()
        return render(request, '01insert.html', locals())
    

    消耗时间:15.766580820083618

    总结:

    1. create插入数据,效率极低,每次都要访问数据库,从而导致很慢
    2. bulk_crate:插入数据,效率高,相当于只访问了一次数据库
    3. 两者效率相差很大

    三、 创建多对多表关系三种方式

    方式一:自行创建第三张表

    class Book(models.Model):
        title = models.CharField(max_length=32, verbose_name="书名")
    
    
    class Author(models.Model):
        name = models.CharField(max_length=32, verbose_name="作者姓名")
    
    
    # 自己创建第三张表,分别通过外键关联书和作者
    class Author2Book(models.Model):
        author = models.ForeignKey(to="Author")
        book = models.ForeignKey(to="Book")
    
        class Meta:
             unique_together = ("author", "book")
    

    方式二:通过ManyToManyField自动创建第三张表

    class Book(models.Model):
        title = models.CharField(max_length=32, verbose_name="书名")
    
    
    # 通过ORM自带的ManyToManyField自动创建第三张表
    class Author(models.Model):
        name = models.CharField(max_length=32, verbose_name="作者姓名")
        books = models.ManyToManyField(to="Book", related_name="authors")
    

    方式三:设置ManyTomanyField并指定自行创建的第三张表

    class Book(models.Model):
        title = models.CharField(max_length=32, verbose_name="书名")
        # authors = models.ManyToManyField(to='Author', through='Book2Author', through_fields=('book','author'))
    
    # 自己创建第三张表,并通过ManyToManyField指定关联
    class Author(models.Model):
        name = models.CharField(max_length=32, verbose_name="作者姓名")
        books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
        # through_fields接受一个2元组('field1','field2'):
        # 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。
    
    class Author2Book(models.Model):
        author = models.ForeignKey(to="Author")
        book = models.ForeignKey(to="Book")
    
        class Meta:
            unique_together = ("author", "book")
    

    总结:

    1. 自动创建第三张表

      • 好处在于 django orm会自动帮你创建第三张关系表
      • 坏处它只会帮你创建两个表的关系字段,不能额外的添加字段
      • 创建第三张表虽然方便但是扩展性较差,不能够添加额外的字段
    2. 纯手动创建第三张表

      • 好处在于第三张表可以任意的添加额外的字段
      • 坏处在于orm查询的时候,很多方法都不支持,从而导致查询数据的时候非常的麻烦
    3. 半手动创建第三表

      • 可以创建额外的字段

      • 手动创建表,会告诉orm,第三张表是自己创建的的,orm主需要给我们提供方便的查询方法

      • 虽然可以使用orm查询的方法,但是当我们使用第三种方式创建多对多关联关系时,就无法使用set、add、remove、clear方法来管理多对多的关系了,需要通过第三张表的model来管理多对多关系。

      • 半自动 一定要加两个额外的参数: through='Book2Author', through_fields=('book','author')

      • 后面字段的顺序: 由第三张表通过哪个字段查询单表 就把哪个字段放前面

    四、MVC框架和MTV框架

    MVC框架

    MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。

    img

    Django框架的设计模式借鉴了MVC框架的思想,也是分成三部分,来降低各个部分之间的耦合性。

    Django框架的不同之处在于它拆分的三部分为:Model(模型)、Template(模板)和View(视图),也就是MTV框架。

    模型: 负责业务对象与数据库的映射(ORM),视图: 负责与用户的交互(页面),控制器: 接受用户的输入调用模型和视图完成用户的请求

    Django的MTV模式

    Model(模型):负责业务对象与数据库的对象(ORM)

    Template(模版):负责如何把页面展示给用户(html)

    View(视图):负责业务逻辑,并在适当的时候调用Model和Template

    此外,Django还有一个urls分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

    Django框架图示

    img

    五、Django的请求生命流程图

    img

    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    [原]终于做了一个登陆页
    JDK 1.7环境变量的配置
    值类型和引用类型讲解,本人在大学时候的笔记,写给新手
    CDays2 习题一 (改进函数)及相关内容解析。Python 基础教程
    Winedt 7.0 Build: 20120321 永久试用方法 Winedt 7.0 破解
    Arduino 笔记。开篇
    What we find changes who we become.
    Python 中的POST/GET包构建以及随机字符串的生成。Python 初级应用
    CDays–2 完成核心功能 CMD模块 Python基础教程 cmd cli
    Python HDB3 AMI 编码与解码
  • 原文地址:https://www.cnblogs.com/randysun/p/11755797.html
Copyright © 2020-2023  润新知