caoyu080202201

一、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\')

 

分类:

技术点:

相关文章: