第九篇:Django之choices参数和多对多关系三种创建方式

第九篇:Django之choices参数和多对多关系三种创建方式

一、choices参数

有些字段有一些特定的属性数据,针对某个可以列举完全的可能性字段,Django提供了choices参数来进行存储。【如 姓名只有 男、女 、不详 三种可能性】

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

具体使用方式如下。为了简便,我们直接Django自带的数据库进行测试,不使用mysql。

我们在models.py中书写这样的代码,来创建数据表。

from django.db import models

# Create your models here.


class User(models.Model):
    username = models.CharField(max_length=32)
    age = models.IntegerField()
    # 性别
    gender_choices = (   # 元组套元组【一般都是数字和字符串】
        (1,'男'),
        (2,'女'),
        (3,'其他'),
    )
    gender = models.IntegerField(choices=gender_choices)  # 使用choices参数   
    
"""
该gender字段存的还是数字,如果存的数字在上面元祖列举的范围之内
那么可以非常轻松的获取到数字对应的真正的内容

如果gender字段存的数字不在上述元祖列举的范围内容,则获得存入的数字本身。
"""

我们使用测试脚本文件来进行测试。

"""存数据"""
from app01 import models

models.User.objects.create(username='yagnyi',age=18,gender=1)
models.User.objects.create(username='leichao',age=24,gender=2)
models.User.objects.create(username='anan',age=23,gender=3)
# 存的时候 没有列举出来的数字也能存(范围还是按照字段类型决定)
 models.User.objects.create(username='yangxin',age=25,gender=4)
    
    
"""取数据"""
user_obj = models.User.objects.filter(pk=1).first()
print(user_obj.gender)  # 1 我们拿到的还是数字
# 那么我们该如何获取对应的数据呢?
# 只要是choices参数的字段,如果你想要获取对应信息,固定写法 get_字段名_display()
print(user_obj.get_gender_display())  # 男


# 如果没有对应关系 那么字段是什么还是展示什么?
user_obj = models.User.objects.filter(pk=4).first()
print(user_obj.get_gender_display())  # 4

二、MTV与MVC模型

Django号称是MTV模型

# MTV模型:
-	M:models
-	T:templates
-	V:views

# MVC:其实django本质也是MVC
-	M:models
-	V:views
-	C:controller
    
补充:vue框架:MVVM模型

三、多对多关系的三种创建方式

简单进行分类,可以分为三种方式【名字自己起的】。

  • 全自动

    利用orm自动帮我们创建第三张关系表,便是之前的建表方式。

    class Book(models.Model):
        name = models.CharField(max_length=32)
        authors = models.ManyToManyField(to='Author')
        
    class Author(models.Model):
         name = models.CharField(max_length=32)
    

    优点:不需要自己写第三张表的代码,非常的方便,而且还支持orm提供操作第三张关系表的方法。

    不足之处:第三张关系表的扩展性极差,没有办法额外添加字段。

  • 纯手动【不推荐】

    自己创建第三张表,使用外键关联,和mysql中建立多对多关系表相同。

    class Book(models.Model):
        name = models.CharField(max_length=32)
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        
    class Book2Author(models.Model):
        book = models.ForeignKey(to='Book')
        author = models.ForeignKey(to='Author')
    

    优点:第三张表完全取决于你自己进行额外的扩展

    不足之处:需要写的代码较多,不能够再使用orm提供的简单的方法。

  • 半自动【推荐】

    虽然也是自己建立第三张表,但是使用让字段指定自己建立的表。拓展性高,比如说要添加图书和作者建立联系的时间。

    class Book(models.Model):
        name = models.CharField(max_length=32)
        authors = models.ManyToManyField(
            to='Author',
            through='Book2Author',
            through_fields=('book','author')
        )
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        
    class Book2Author(models.Model):
        book = models.ForeignKey(to='Book')
        author = models.ForeignKey(to='Author')
        
    """
    through_fields字段先后顺序?
     判断的本质:
            通过第三张表查询对应的表,需要用到哪个字段就把哪个字段放前面
    也可以简化判断
            当前表是谁,就把对应的关联字段放前面
    """
    
    如果是Author创建的多对多关系,则through_fields这样书写。
    class Author(models.Model):
        name = models.CharField(max_length=32)
        books = models.ManyToManyField(
            to='Book',
            through='Book2Author',
            through_fields=('author','book')
        )
    

    可以使用orm的正反向查询 但是没法使用add,set,remove,clear这四个方法【也不需要使用】。

posted @ 2021-07-02 19:32  YangYi215  阅读(174)  评论(0编辑  收藏  举报