django 第八弹

今日内容简介
choices参数(数据库字段设计常见)
MTV与MVC模型
多对多关系的三种创建方式

今日内容详解

一:choices参数(数据库字段设计常见)

"""
用户表	
性别
学历
工作经验
是否结婚
是否生子
客户来源
...
针对某个可以列举完全的可能性字段,我们应该如何存储

只要某个字段的可能性是可以列举完全的,那么一般情况下都会采用choices参数
"""
class User(models.Model):
username = models.CharField(max_length=32)
age = models.IntegerField()
# 性别
gender_choices = (
    (1,'男'),
    (2,'女'),
    (3,'其他'),
)
gender = models.IntegerField(choices=gender_choices)

score_choices = (
    ('A','优秀'),
    ('B','良好'),
    ('C','及格'),
    ('D','不合格'),
)
# 保证字段类型跟列举出来的元祖第一个数据类型一致即可
score = models.CharField(choices=score_choices,null=True)
"""
该gender字段存的还是数字 但是如果存的数字在上面元祖列举的范围之内
那么可以非常轻松的获取到数字对应的真正的内容

1.gender字段存的数字不在上述元祖列举的范围内容
2.如果在 如何获取对应的中文信息
"""

  
from app01 import models
# models.User.objects.create(username='jason',age=18,gender=1)
# models.User.objects.create(username='egon',age=85,gender=2)
# models.User.objects.create(username='tank',age=40,gender=3)
# 存的时候 没有列举出来的数字也能存(范围还是按照字段类型决定)
# models.User.objects.create(username='tony',age=45,gender=4)

# 取
# user_obj = models.User.objects.filter(pk=1).first()
# print(user_obj.gender)
# 只要是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模型

# MTV:Django号称是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提供操作第三张关系表的方法...
不足之处:第三张关系表的扩展性极差(没有办法额外添加字段...)
"""
# 纯手动
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_id = models.ForeignKey(to='Book')
author_id = 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)
# books = models.ManyToManyField(to='Book',
#                                  through='Book2Author',
#                                  through_fields=('author','book')
#                                  )
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')

"""
through_fields字段先后顺序
判断的本质:
    通过第三张表查询对应的表 需要用到哪个字段就把哪个字段放前面
你也可以简化判断
    当前表是谁 就把对应的关联字段放前面
    
    
半自动:可以使用orm的正反向查询 但是没法使用	add,set,remove,clear这四个方法
"""

# 总结:你需要掌握的是全自动和半自动 为了扩展性更高 一般我们都会采用半自动(写代码要给自己留一条后路)
上一篇:MySql 语句练习50题


下一篇:python给列表中的字典按照字典中的某个键值进行排序