一、choices参数:
1、当某个字段的选支是可完全列举的时候,一般会采用choices参数。
2、用一些简洁的符号代替较为复杂的信息。
3、实例:
①models.py:
class User(models.Model): # 先定义好符号与实际信息的对应关系 gender_choices = ( (1, '男'), (2, '女'), (3, '未知') ) # 字段的数据类型以符号的类型为准 gender = models.IntegerField(choices=gender_choices, verbose_name='性别') # 定义第二个字段,以字符为符号 level_choices = ( ('A', '璀璨钻石'), ('B', '华贵铂金'), ('C', '荣耀黄金'), ('D', '不屈白银'), ('E', '英勇青铜'), ('F', '菜比黑铁'), ) level = models.CharField(max_length=32, choices=level_choices, verbose_name='等级')
②tests.py:
# 与数据库的关联操作以符号为依据 models.User.objects.create( gender=1, level='A' ) user_obj_1 = models.User.objects.filter(gender=1).first() # 直接用字段名,显示的是符号 print(user_obj_1.gender, user_obj_1.level) # 通过 get_字段名_display() 的方法可以显示对应的真实信息 print(user_obj_1.get_gender_display(), user_obj_1.get_level_display()) # 若新建的记录的choices字段的值不在预设范围内 models.User.objects.create( gender=10, level='S' ) # 则 get_字段名_display() 方法依然显示符号 user_obj_2 = models.User.objects.filter(gender=10).first() print(user_obj_2.get_gender_display(), user_obj_2.get_level_display())
二、MTV模式与MVC模式
1、都是框架模式的分类。
2、MTV:M(models)---T(templates)---V(views),正是Django的模式。
3、MVC:M(models)---V(views)---C(controller),MTV的本质还是MVC。
4、其他:如vue框架则是MVVM模式。
三、创建多对多表关系的三种方式。
1、全自动:通过orm内部机制自动生成关系表。
①优点:不用自己书写创建关系表的代码,支持所有orm提供的用于操作关系表的方法。
②不足:关系表只有固定的两个字段,无法拓展。
③实例:
class Hunter(models.Model): name = models.CharField(max_length=32, verbose_name='猎手名字') tasks = models.ManyToManyField(to='Task', verbose_name='已接任务') class Task(models.Model): name = models.CharField(max_length=32, verbose_name='任务名称')
2、全手动:另外手动创建关系表,手动创建关系表的字段。
①优点:关系表的字段可以任意拓展。
②不足:需要自己书写创建关系表的代码,稍显麻烦,不能使用任何orm提供的方法。
③综上,一般不使用全手动。
④实例:
class Student(models.Model): name = models.CharField(max_length=32, verbose_name='学生姓名') class Course(models.Model): name = models.CharField(max_length=32, verbose_name='课程名称') class StudentToCourse(models.Model): # 命名需要加上 _id,无法通过orm机制自动添加 student_id = models.ForeignKey(to='Student') course_id = models.ForeignKey(to='Course')
3、半自动:另外手动创建关系表,手动创建关系表的字段,然后将外键持有表与关系表建立通道。
①优点:如此既能够实现关系表的字段可以任意拓展,也可以使用orm的正反向查询。
②不足:依然需要自己书写创建关系表的代码,无法使用orm的add,set,delete,clear方法。
③实例:
class Book(models.Model): name = models.CharField(max_length=32, verbose_name='书籍名称') tags = models.ManyToManyField( to='Tag', through='BookToTag', through_fields=('book', 'tag'), # 外键持有表的对应字段写前面 verbose_name='适用标签' ) class Tag(models.Model): name = models.CharField(max_length=32, verbose_name='标签名称') class BookToTag(models.Model): # 不需要加 _id,orm机制会自动加上 book = models.ForeignKey(to='Book') tag = models.ForeignKey(to='Tag')