第九篇:Django之choices参数和多对多关系三种创建方式
第九篇:Django之choices参数和多对多关系三种创建方式
一、choices参数
有些字段有一些特定的属性数据,针对某个可以列举完全的可能性字段,Django提供了choices参数来进行存储。【如 姓名只有 男、女 、不详 三种可能性】
只要某个字段的可能性是可以列举完全的,那么一般情况下都会采用choices参数。
具体使用方式如下。为了简便,我们直接Django自带的数据库进行测试,不使用mysql。
我们在models.py中书写这样的代码,来创建数据表。
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
# 性别
gender_choices = ( # 元组套元组【一般都是数字和字符串】
(1,'男'),
(2,'女'),
(3,'其他'),
)
gender = models.IntegerField(choices=gender_choices) # 使用choices参数
"""
该gender字段存的还是数字,如果存的数字在上面元祖列举的范围之内
那么可以非常轻松的获取到数字对应的真正的内容
如果gender字段存的数字不在上述元祖列举的范围内容,则获得存入的数字本身。
"""
我们使用测试脚本文件来进行测试。
"""存数据"""
from app01 import models
models.User.objects.create(username='yagnyi',age=18,gender=1)
models.User.objects.create(username='leichao',age=24,gender=2)
models.User.objects.create(username='anan',age=23,gender=3)
# 存的时候 没有列举出来的数字也能存(范围还是按照字段类型决定)
models.User.objects.create(username='yangxin',age=25,gender=4)
"""取数据"""
user_obj = models.User.objects.filter(pk=1).first()
print(user_obj.gender) # 1 我们拿到的还是数字
# 那么我们该如何获取对应的数据呢?
# 只要是choices参数的字段,如果你想要获取对应信息,固定写法 get_字段名_display()
print(user_obj.get_gender_display()) # 男
# 如果没有对应关系 那么字段是什么还是展示什么?
user_obj = models.User.objects.filter(pk=4).first()
print(user_obj.get_gender_display()) # 4
二、MTV与MVC模型
Django号称是MTV模型
# MTV模型:
- M:models
- T:templates
- V:views
# MVC:其实django本质也是MVC
- M:models
- V:views
- C:controller
补充:vue框架:MVVM模型
三、多对多关系的三种创建方式
简单进行分类,可以分为三种方式【名字自己起的】。
-
全自动
利用orm自动帮我们创建第三张关系表,便是之前的建表方式。
class Book(models.Model): name = models.CharField(max_length=32) authors = models.ManyToManyField(to='Author') class Author(models.Model): name = models.CharField(max_length=32)
优点:不需要自己写第三张表的代码,非常的方便,而且还支持orm提供操作第三张关系表的方法。
不足之处:第三张关系表的扩展性极差,没有办法额外添加字段。
-
纯手动【不推荐】
自己创建第三张表,使用外键关联,和mysql中建立多对多关系表相同。
class Book(models.Model): name = models.CharField(max_length=32) class Author(models.Model): name = models.CharField(max_length=32) class Book2Author(models.Model): book = models.ForeignKey(to='Book') author = models.ForeignKey(to='Author')
优点:第三张表完全取决于你自己进行额外的扩展
不足之处:需要写的代码较多,不能够再使用orm提供的简单的方法。
-
半自动【推荐】
虽然也是自己建立第三张表,但是使用让字段指定自己建立的表。拓展性高,比如说要添加图书和作者建立联系的时间。
class Book(models.Model): name = models.CharField(max_length=32) authors = models.ManyToManyField( to='Author', through='Book2Author', through_fields=('book','author') ) class Author(models.Model): name = models.CharField(max_length=32) class Book2Author(models.Model): book = models.ForeignKey(to='Book') author = models.ForeignKey(to='Author') """ through_fields字段先后顺序? 判断的本质: 通过第三张表查询对应的表,需要用到哪个字段就把哪个字段放前面 也可以简化判断 当前表是谁,就把对应的关联字段放前面 """ 如果是Author创建的多对多关系,则through_fields这样书写。 class Author(models.Model): name = models.CharField(max_length=32) books = models.ManyToManyField( to='Book', through='Book2Author', through_fields=('author','book') )
可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法【也不需要使用】。