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

【1】choices参数的使用

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

例如:性别,代码如下

python 复制代码
# 1.创建一张表
 
class gender_info(models.Model):
    name = models.CharField(max_length=32)
    password = models.CharField(max_length=32)
    
    # 创建一个映射关系
    gender_choices = (
        (1,'男'),
        (2,'女'),
        (3,'其它'),
    )
    gender = models.IntegerField(choices=gender_choices)



# 2.导入数据

  from app01 import models

    models.gender_info.objects.create(name='kevin',password=12,gender=1)
    models.gender_info.objects.create(name='jack',password=123,gender=2)
    models.gender_info.objects.create(name='tank',password=121,gender=3)
    models.gender_info.objects.create(name='jerry',password=1213,gender=4)

# 3.查找数据
   '''使用choices参数查找结果要使用get_字段名_display()'''

    obj = models.gender_info.filter(id=1).first()

    print(obj.gender)    # 返回的结果是1
    print(obj.get_gender_display())    # 返回的结果是男
 
'''
注意事项:
    当查询的结果没有映射关系时,查找的结果不会报错,只会返回我们给的值。例如

    obj1 = models.gender_info.objects.filter(id=4).first()
    print(obj1.get_gender_display())    # 返回的结果为4
    
'''

【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自动创建第三张表

python 复制代码
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")
 
# 全自动
它的优势就是自动帮我们创建表,而且还可以使用那四个方法:add set remove clear
# 缺点就是扩展性非常差

【3.2】全手动创建第三张表

python 复制代码
全手动
# 自己创建第三张表,分别通过外键关联书和作者
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")
    register_time=''
    
它的优势:可扩展性很高
缺点:不能使用orm查询方法了,那四个方法也不用用了add set remoce clear 都不能用了

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

python 复制代码
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")

优点:还可以使用orm的方法及正反向查询,但是不能使用add set remove clear方法了

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

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

相关推荐
理智的煎蛋15 分钟前
GPU 服务器压力测试核心工具全解析:gpu-burn、cpu-burn 与 CUDA Samples
运维·服务器·人工智能·压力测试·gpu算力
陈敬雷-充电了么-CEO兼CTO18 分钟前
视频理解新纪元!VideoChat双模架构突破视频对话瓶颈,开启多模态交互智能时代
人工智能·chatgpt·大模型·多模态·世界模型·kimi·deepseek
simodai33 分钟前
机器学习1.Anaconda安装+环境配置
人工智能·机器学习
IT_陈寒39 分钟前
JavaScript 2024:10个颠覆你认知的ES新特性实战解析
前端·人工智能·后端
ModelWhale44 分钟前
AI教育白皮书解读 | 医学教育数智化转型新机遇,“人工智能+”行动实践正当时
人工智能·ai
大模型真好玩1 小时前
大模型工程面试经典(五)—大模型微调与RAG该如何选?
人工智能·面试·deepseek
九章云极AladdinEdu2 小时前
临床数据挖掘与分析:利用GPU加速Pandas和Scikit-learn处理大规模数据集
人工智能·pytorch·数据挖掘·pandas·scikit-learn·paddlepaddle·gpu算力
上海锝秉工控2 小时前
超声波风向传感器:以科技之翼,捕捉风的每一次呼吸
大数据·人工智能·科技
说私域2 小时前
基于开源AI智能名片、链动2+1模式与S2B2C商城小程序的流量运营与个人IP构建研究
人工智能·小程序·流量运营
xiaoxiaoxiaolll4 小时前
期刊速递 | 《Light Sci. Appl.》超宽带光热电机理研究,推动碳纳米管传感器在制药质控中的实际应用
人工智能·学习