首页 > 其他 > 详细

Django之模型层03

时间:2020-06-03 00:25:00      阅读:58      评论:0      收藏:0      [点我收藏+]

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

 

Django之模型层03

原文:https://www.cnblogs.com/caoyu080202201/p/13034301.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!