ORM中choices参数(重要)、MTV于MVC模型、多对多关系三种创建方式

choices参数(重要)

使用方式 :

只要某个字段的可能性是可以列举完全的,那么一般情况下都会采用choices参数

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

choice使用方法

class User(models.Model):
    name = models.CharField(max_length=32)
    age = IntegerField()
    **************************choice用法***************************
    # 性别
	sex_choices = (    # 格式: 必须用元组套元组的形式  
    	(1, '男')	  # 而且小元组里第一个元素必须符合下面创建的字段类型
        (2, '女')
        (3, '其他')
    )
    sex = models.IntegerField(choices=sex_choices)

取:

# 先添加数据
models.User.objects.create(name='jason', age=18, sex=1)
models.User.objects.create(name='kevin', age=20, sex=2)
models.User.objects.create(name='tony', age=22, sex=3)
models.User.objects.create(name='egon', age=24, sex=4)

# 读取数据
user_list = models.User.objects.all()
    for user_obj in user_list:
        print(user_obj.get_sex_display())  # get_字段名_display()是固定句式

image

score_choices = (
        ('A','优秀'),
        ('B','良好'),
        ('C','及格'),
        ('D','不合格'),
    )
# 保证字段类型跟列举出来的元祖第一个数据类型一致即可
score = models.CharField(choices=score_choices,null=True)

image

相似案例

class Customer(models.Model):
    """
    客户表
    """
    qq = models.CharField(verbose_name='qq', max_length=64, unique=True, help_text='QQ号必须唯一')

    name = models.CharField(verbose_name='学生姓名', max_length=16)
    gender_choices = ((1, '男'), (2, '女'))
    gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)

    education_choices = (
        (1, '重点大学'),
        (2, '普通本科'),
        (3, '独立院校'),
        (4, '民办本科'),
        (5, '大专'),
        (6, '民办专科'),
        (7, '高中'),
        (8, '其他')
    )
    education = models.IntegerField(verbose_name='学历', choices=education_choices, blank=True, null=True, )
    graduation_school = models.CharField(verbose_name='毕业学校', max_length=64, blank=True, null=True)
    major = models.CharField(verbose_name='所学专业', max_length=64, blank=True, null=True)
experience_choices = [
        (1, '在校生'),
        (2, '应届毕业'),
        (3, '半年以内'),
        (4, '半年至一年'),
        (5, '一年至三年'),
        (6, '三年至五年'),
        (7, '五年以上'),
    ]
    experience = models.IntegerField(verbose_name='工作经验', blank=True, null=True, choices=experience_choices)
    work_status_choices = [
        (1, '在职'),
        (2, '无业')
    ]
    work_status = models.IntegerField(verbose_name="职业状态", choices=work_status_choices, default=1, blank=True,
                                      null=True)
    company = models.CharField(verbose_name="目前就职公司", max_length=64, blank=True, null=True)
    salary = models.CharField(verbose_name="当前薪资", max_length=64, blank=True, null=True)

    source_choices = [
        (1, "qq群"),
        (2, "内部转介绍"),
        (3, "官方网站"),
        (4, "百度推广"),
        (5, "360推广"),
        (6, "搜狗推广"),
        (7, "腾讯课堂"),
        (8, "广点通"),
        (9, "高校宣讲"),
        (10, "渠道代理"),
        (11, "51cto"),
        (12, "智汇推"),
        (13, "网盟"),
        (14, "DSP"),
        (15, "SEO"),
        (16, "其它"),
    ]
    source = models.SmallIntegerField('客户来源', choices=source_choices, default=1)
    referral_from = models.ForeignKey(
        'self',
        blank=True,
        null=True,
        verbose_name="转介绍自学员",
        help_text="若此客户是转介绍自内部学员,请在此处选择内部学员姓名",
        related_name="internal_referral"
    )
    course = models.ManyToManyField(verbose_name="咨询课程", to="Course")

    status_choices = [
        (1, "已报名"),
        (2, "未报名")
    ]
    status = models.IntegerField(
        verbose_name="状态",
        choices=status_choices,
        default=2,
        help_text=u"选择客户此时的状态"
    )

    consultant = models.ForeignKey(verbose_name="课程顾问", to='UserInfo', related_name='consultanter',limit_choices_to={'depart':1001})

    date = models.DateField(verbose_name="咨询日期", auto_now_add=True)
    recv_date = models.DateField(verbose_name="当前课程顾问的接单日期", null=True)
    last_consult_date = models.DateField(verbose_name="最后跟进日期", )

    def __str__(self):
        return self.name

MTV与MVC模型

# MTV:Django号称是MTV模型
M:models
T:templates
V:views
# MVC:其实django本质也是MVC
M:models
V:views
C:controller
  
# vue框架:MVVM模型

多对多三种创建方式

半自动 全自动 纯手动
优点:可以使用orm的正反向查询,并且第三张表的扩展性高 优点: 代码不需要自己写,方便,还支持orm提供操作第三张关系表的方法 优点: 第三张表完全取决你自己进行额外的扩展
缺点: 没办法使用add,set,remove,clear这四个方法 缺点: 第三张关系表的扩展性极差(没办法额外添加字段) 缺点: 需要写的代码较多,不能够再使用orm提供的简单的方法

半自动(必须掌握)

需要手动创建第三张表

class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name='书名')
    authors = models.ManyToManyField(to='Author', 
                               through='BookToAuthor',  # 告诉ORM我的第三张表是谁
                               through_fields=('book', 'author'))  # 告诉ORM是通过那两个字段建立关系的
							# 因为第三张表有可能还有其他的外籍那字段,所以要指明
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name='姓名')

class BookToAuthor(models.Model):
    book = models.ForeignKey(to='Book')
    author = models.ForeignKey(to='Author')
    
    
# 注意: through_fields字段先后顺序,当前表是谁 就把对应的关联字段放前面,如果上面的外键字段是在作者表里创建的,那么throuth_field元组里的参数要调换位置through_fields=('author', 'book')) 就可以了

全自动(熟练)

利用orm帮我们创建第三张关系表

class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name='书名')
    authors = models.ManyToManyField(to='Author')
    
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name='姓名')
# 第三张关系表ORM会自动帮我们创建

纯手动(了解)

需要手动创建第三张表

class Book(models.Model):
    title = models.CharField(max_length=32, verbose_name='书名')
    authors = models.ManyToManyField(to='Author')
    
class Author(models.Model):
    name = models.CharField(max_length=32, verbose_name='姓名')

# 手动创建
class BookToAuthor(models.Model):
    book_id = models.ForeignKey(to='Book')
    author_id = models.ForeignKey(to='Author')

总结

需要掌握的是全自动和半自动 为了扩展性更高 一般我们都会采用半自动(写代码要给自己留一条后路)

posted @ 2022-03-04 18:30  zong涵  阅读(113)  评论(0编辑  收藏  举报