Django之模型层03

一、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')
原文地址:https://www.cnblogs.com/caoyu080202201/p/13034301.html