• 11.20 知识总结(choices参数、MVC和MTV的模式、Django与Ajax技术)


    一、 choices参数的使用

        1.1 作用

    1. 针对某个可以列举完全的可能性字段,我们应该如何存储

    2. .只要某个字段的可能性是可以列举完全的,那么一般情况下都会采用choices参数

       1.2 应用场景

     应用场景:
    学历:
        小学 初中 高中 本科 硕士 博士   1 2 3 4 5 6
        
    客户来源:
        微信渠道 广告 介绍 QQ 等等
        
    性别:
        男 女  未知

         1.3  choices参数的使用

    1. class UserInfo(models.Model):
    2. username = models.CharField(max_length=64)
    3. password = models.CharField(max_length=32)
    4. # 先写一个映射关系
    5. gender_choices = (
    6. (1, '男'),
    7. (2, '女'),
    8. (3, '未知'),
    9. )
    10. """字段存储的范围还是取决于数据类型的字段"""
    11. gender = models.SmallIntegerField(choices=gender_choices) # 男 女 未知 1 2 3 4
    12. # score A:优秀 B:良好 C:及格 D:不及格
    13. score_choices=(
    14. ('A', '优秀'),
    15. ('B', '良好'),
    16. ('C', '及格'),
    17. ('D', '不及格'),
    18. )
    19. score = models.CharField(choices=score_choices,max_length=32, null=True)
    20. res=models.UserInfo.objects.filter(pk=4).first()
    21. print(res.gender) # 1
    22. # get_字段名_display()
    23. # 如果你存储的数据没有在映射范围内,就原样输出,如果有,就显示对应的关系对应的数据
    24. print(res.get_score_display())

    二、 MVC&MTV模式

    2.1 MVC 

    MVC 模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
    MVC 以一种插件式的、松耦合的方式连接在一起。

    模型(M)- 编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
    视图(V)- 图形界面,负责与用户的交互(页面)。
    控制器(C)- 负责转发请求,对请求进行处理。

     

    2.2  MTV 模型

    Django 的 MTV 模式本质上和 MVC 是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django 的 MTV 分别是指:
    M 表示模型(Model):编写程序应有的功能,负责业务对象与数据库的映射(ORM)。
    T 表示模板 (Template):负责如何把页面(html)展示给用户。
    V 表示视图(View):负责业务逻辑,并在适当时候调用 Model和 Template

     

     三、多对多的三种创建方式

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

    1. class Book(models.Model):
    2. title = models.CharField(max_length=32, verbose_name="书名")
    3. # 通过ORM自带的ManyToManyField自动创建第三张表
    4. class Author(models.Model):
    5. name = models.CharField(max_length=32, verbose_name="作者姓名")
    6. books = models.ManyToManyField(to="Book", related_name="authors")
    7. # 全自动
    8. 它的优势就是自动帮我们创建表,而且还是使用那四个方法:add set remove clear
    9. # 缺点就是扩展性非常差

      3.2 方式二:自行创建第三张表

    1. class Book(models.Model):
    2. title = models.CharField(max_length=32, verbose_name="书名")
    3. class Author(models.Model):
    4. name = models.CharField(max_length=32, verbose_name="作者姓名")
    5. 全手动
    6. # 自己创建第三张表,分别通过外键关联书和作者
    7. class Book(models.Model):
    8. title = models.CharField(max_length=32, verbose_name="书名")
    9. class Author(models.Model):
    10. name = models.CharField(max_length=32, verbose_name="作者姓名")
    11. # 自己创建第三张表,分别通过外键关联书和作者
    12. class Author2Book(models.Model):
    13. author = models.ForeignKey(to="Author")
    14. book = models.ForeignKey(to="Book")
    15. register_time=''
    16. 它的优势:可扩展性很高
    17. 缺点:不能使用orm查询方法了,那四个方法也不用用了add set remoce clear 都不能用了

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

    1. lass Book(models.Model):
    2. title = models.CharField(max_length=32, verbose_name="书名")
    3. # 自己创建第三张表,并通过ManyToManyField指定关联
    4. class Author(models.Model):
    5. name = models.CharField(max_length=32, verbose_name="作者姓名")
    6. books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
    7. # through_fields接受一个2元组('field1','field2'):
    8. # 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。
    9. class Author2Book(models.Model):
    10. author = models.ForeignKey(to="Author")
    11. book = models.ForeignKey(to="Book")
    12. 优点:还可以使用orm的方法及正反向查询,但是不能使用add set remove clear方法了
    13. 推荐使用另外两种方式,全自动额不太建议

    四、  Ajax技术

    它是前端的技术,不是Python的知识点,但是它需要结合Python来学习
    AJAX除了异步的特点外,还有一个就是:浏览器页面局部刷新
    1. 异步提交
    2. 局部刷新

    Ajax的学习按理来说其实还是js代码,应该学习JavaScript的Ajax的写法,就不学习JavaScript版本的,直接学习jQuery版本的,帮我们封装了,如果不封装,js版本的Ajax非常复杂
    document.getElementById('d1').innerHTML = xmlhttp.responseText;
    document.getElementByClssName('c1').innerHTML = xmlhttp.responseText;
    document.getElementById('d1').innerHTML = xmlhttp.responseText;
    document.querySelector('#d1 a ').innerHTML = xmlhttp.responseText;
    document.querySelector('.c1').innerHTML = xmlhttp.responseText;
    document.querySelector('h1').innerHTML = xmlhttp.responseText;

    2. 案例

    1. 有一个页面
    2. def ab_ajax(request):
    3. # if request.is_ajax():
    4. if request.method=='POST':
    5. '''接收ajax提交过来的数据'''
    6. #
    7. print(request.POST)
    8. # d1 = request.POST.get('inp1') # str
    9. # d2 = request.POST.get('inp2') # str
    10. # d3 = int(d1) + int(d2)
    11. # 序列化
    12. import json
    13. # json.dumps(d3)
    14. user_dict = {"username":"kevin", "password":123}
    15. # return HttpResponse(json.dumps(d3))
    16. return HttpResponse(json.dumps(user_dict))
    17. # return JsonResponse(user_dict)
    18. return render(request, 'ab_ajax.html')
  • 相关阅读:
    开源原生android的视频编辑软件
    金仓数据库KingbaseES ksql工具用户指南及参考--2. Ksql快速启动
    【算法】Java 算法设计模式的应用场景
    Spring Boot 生成二维码
    恒运资本:减肥药概念涨疯了!特斯拉一夜暴涨5800亿市值,汽车股狂飙
    物理引擎介绍
    buildroot添加package包
    计算机视觉与深度学习 | 非线性优化理论:图优化、高斯牛顿法和列文伯格-马夸尔特算法
    【JVM】分代收集和垃圾收集算法详解
    【华为机试真题 JAVA】小朋友排队-100
  • 原文地址:https://blog.csdn.net/weixin_66010453/article/details/134509563