【1】choices参数的使用
应用场景:针对表中可能列表完全的字段,采用choices参数
例如:性别,代码如下
# 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 modelsmodels.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) # 返回的结果是1print(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)
- 负责与用户交互(页面)
- 模型(M)
图解
【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自动创建第三张表
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】全手动创建第三张表
全手动
# 自己创建第三张表,分别通过外键关联书和作者
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并指定自行创建的第三张表
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方法了
推荐使用方式二或者方式三,因为方式二和方式三的扩展性比较高,修改或者增添的时候比较好操作。
不推荐使用方式一,因为扩展性比较差