zoukankan      html  css  js  c++  java
  • 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')
  • 相关阅读:
    模拟Spring的Ioc
    Java常见异常总结
    Java编码与乱码问题
    Java正则表达式入门
    观察者模式
    Java内存泄漏问题
    责任链模式
    选择排序(C++/Java实现)
    设计模式学习工厂模式
    Java验证码
  • 原文地址:https://www.cnblogs.com/caoyu080202201/p/13034301.html
Copyright © 2011-2022 走看看