• choices参数的使用、MVC和MTV的模式、创建表对表关系的三种创建方式


    【1】choices参数的使用

    应用场景:针对表中可能列表完全的字段,采用choices参数

     

    例如:性别,代码如下

    1. # 1.创建一张表
    2. class gender_info(models.Model):
    3. name = models.CharField(max_length=32)
    4. password = models.CharField(max_length=32)
    5. # 创建一个映射关系
    6. gender_choices = (
    7. (1,'男'),
    8. (2,'女'),
    9. (3,'其它'),
    10. )
    11. gender = models.IntegerField(choices=gender_choices)
    12. # 2.导入数据
    13. from app01 import models
    14. models.gender_info.objects.create(name='kevin',password=12,gender=1)
    15. models.gender_info.objects.create(name='jack',password=123,gender=2)
    16. models.gender_info.objects.create(name='tank',password=121,gender=3)
    17. models.gender_info.objects.create(name='jerry',password=1213,gender=4)
    18. # 3.查找数据
    19. '''使用choices参数查找结果要使用get_字段名_display()'''
    20. obj = models.gender_info.filter(id=1).first()
    21. print(obj.gender) # 返回的结果是1
    22. print(obj.get_gender_display()) # 返回的结果是男
    23. '''
    24. 注意事项:
    25. 当查询的结果没有映射关系时,查找的结果不会报错,只会返回我们给的值。例如
    26. obj1 = models.gender_info.objects.filter(id=4).first()
    27. print(obj1.get_gender_display()) # 返回的结果为4
    28. '''

    【2】MVC和MTV的模式

    【2.1】MVC

    • 保持各组件的松耦合关系
    • MVC分成3个部分
      • 模型(M)
        • 负责业务对象和数据库的映射
      • 控制器(C)
        • 解释用户的输入调用模型,和视图完成用户的请求
      • 视图(V)
        • 负责与用户交互(页面)

    图解

            

    【2.2】MTV

    • MTV分别代表的关系
      • M代表模型(Model):负责业务对象和数据库的关系映射(ORM)
      • T代表模板(Templates):负责如何把页面展示给用户(html)
      • V代表视图(View):负责业务逻辑,并在适当时候调用Model合Template

    除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template

    MTV的响应模式图

    【3】表关系多对多创建的三种方式

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

            【3.3】半自动:设置ManyToManyField并指定自行创建的第三张表

    1. class Author(models.Model):
    2. name = models.CharField(max_length=32, verbose_name="作者姓名")
    3. books = models.ManyToManyField(to="Book", through="Author2Book", through_fields=("author", "book"))
    4. # through_fields接受一个2元组('field1','field2'):
    5. # 其中field1是定义ManyToManyField的模型外键的名(author),field2是关联目标模型(book)的外键名。
    6. class Author2Book(models.Model):
    7. author = models.ForeignKey(to="Author")
    8. book = models.ForeignKey(to="Book")
    9. 优点:还可以使用orm的方法及正反向查询,但是不能使用add set remove clear方法了

    推荐使用方式二或者方式三,因为方式二和方式三的扩展性比较高,修改或者增添的时候比较好操作。

     

    不推荐使用方式一,因为扩展性比较差

  • 相关阅读:
    Vue 路由 ElementUI组件库
    Ubuntu 20.04上docker安装RabbitMQ并确保可以访问RabbitMQ的管理界面
    【校招VIP】前端JS语言考点之选择器和优先级
    Social login -- LittleLink
    【BOOST C++Data-struct专题04】 Boost.PropertyTree
    打游戏的蓝牙耳机推荐哪一款?吃鸡蓝牙游戏耳机推荐
    前后端跨域
    .Net Core 6 运行环境手动安装流程
    开启安全测试评估赛道,永信至诚发布“数字风洞”产品体系
    STM32F1读取MLX90632非接触式红外温度传感器
  • 原文地址:https://blog.csdn.net/m0_69962105/article/details/134509215