Django处理枚举(枚举模型)以及source的使用

04-19 1167阅读 0评论

Django处理枚举(枚举模型)以及source的使用


Django处理枚举-枚举模型

  • 1、定义模型类、序列化器类
  • 2、对上面这些场景使用source参数
  • 3、支持连表查询
  • 4、自定义序列化输出方法
  • 5、案例5

    1、定义模型类、序列化器类

    定义模型类models.py;项目模型类、接口模型类、用例模型类

    from django.db import models
    class Test_Project(models.Model):
        name = models.CharField(help_text='项目名称', verbose_name='项目名称',
                                max_length=60,
                                unique=True)
        desc = models.TextField(help_text='项目描述', blank=True, null=True)
        create_time = models.DateTimeField(auto_now_add=True)
        update_time = models.DateTimeField(auto_now=True)
        class Meta:
            db_table = "t_test_project"
            verbose_name = "项目表"
            verbose_name_plural = verbose_name
            ordering = ['id']
        def __str__(self):
            return self.name
    

    CHOICES = [('1', '项目接口'),('2', '外部接口')]

    type = models.CharField(verbose_name='接口类型', help_text='接口类型', max_length=40,default='1', choices=CHOICES)

    from django.db import models
    class Test_Interface(models.Model):
        CHOICES = [
            ('1', '项目接口'),
            ('2', '外部接口')
        ]
        name = models.CharField(help_text='接口名称', verbose_name='接口名称',
                                max_length=60,
                                unique=True)
        desc = models.TextField(help_text='接口描述', blank=True, null=True, default='描述')
        type = models.CharField(verbose_name='接口类型', help_text='接口类型',
                                max_length=40,
                                default='1', choices=CHOICES)
        project = models.ForeignKey(Test_Project, on_delete=models.CASCADE)
        playcount=models.IntegerField(help_text='访问量',verbose_name='访问量',default=0)
        commentcount = models.IntegerField(default=0, verbose_name='评论量')
        class Meta:
            db_table = 't_test_interface'
            verbose_name = "接口表"
            verbose_name_plural = verbose_name
            ordering = ['id']
        def __str__(self):
            return self.name
    
    from django.db import models
    class Test_Testcase(models.Model):
        name = models.CharField(help_text='用例名称', verbose_name='用例名称',
                                max_length=60,
                                unique=True)
        desc = models.TextField(help_text='用例名称', blank=True, null=True)
        create_time = models.DateTimeField(auto_now_add=True)
        update_time = models.DateTimeField(auto_now=True)
        interface = models.ForeignKey(Test_Interface, on_delete=models.CASCADE)
        class Meta:
            db_table = "t_test_testcase"
            verbose_name = "用例表"
            verbose_name_plural = verbose_name
            ordering = ['id']
        def __str__(self):
            return self.name
    

    序列化器类设计

    from rest_framework import serializers
    from ttest.models import Test_Project,Test_Interface
    class TProjectSerializer(serializers.ModelSerializer):
        class Meta:
            model=Test_Project
            fields='__all__'
    class TInterfaceSerializer(serializers.ModelSerializer):
        class Meta:
            model=Test_Interface
            fields='__all__'
    

    访问接口:前端展示的数据type:“1”

    使用默认的序列化器时,视图函数访问 具有choices参数 的字段或 一对一 或 一对多 或 多对多 字段时,返回的数据只有 id 值,就像下面这种方式,性别是0或1

    Django处理枚举(枚举模型)以及source的使用

    2、对上面这些场景使用source参数

    get_xxx_display 用于显示 choices 参数对应的文本信息。

    序列化器文件:serializers.py

    class TProjectSerializer(serializers.ModelSerializer):
        class Meta:
            model=Test_Project
            fields='__all__'
    class TInterfaceSerializer(serializers.ModelSerializer):
        type = serializers.ChoiceField(choices=Test_Interface.CHOICES,
                                       source="get_type_display",
                                       read_only=True)  # 设置source="get_属性_display"即可
        class Meta:
            model=Test_Interface
            fields='__all__'
    

    Django处理枚举(枚举模型)以及source的使用

    3、支持连表查询

    project_create_time=serializers.CharField(source='project.create_time')

    显示 一对一 或 一对多 或 多对多 字段对应的文本信息。支持连表查询

    from rest_framework import serializers
    from ttest.models import Test_Project,Test_Interface
    class TProjectSerializer(serializers.ModelSerializer):
        class Meta:
            model=Test_Project
            fields='__all__'
    class TInterfaceSerializer(serializers.ModelSerializer):
        type = serializers.ChoiceField(choices=Test_Interface.CHOICES,
                                       source="get_type_display",
                                       read_only=True)  # 设置source="get_属性_display"即可
        project_create_time=serializers.CharField(source='project.create_time')
        class Meta:
            model=Test_Interface
            fields='__all__'
    

    Django处理枚举(枚举模型)以及source的使用

    4、自定义序列化输出方法

    自定义序列化输出方法,会寻找并执行’get_xxx’的方法。

    from rest_framework import serializers
    from ttest.models import Test_Project,Test_Interface
    class TProjectSerializer(serializers.ModelSerializer):
        class Meta:
            model=Test_Project
            fields='__all__'
    class TInterfaceSerializer(serializers.ModelSerializer):
        type = serializers.ChoiceField(choices=Test_Interface.CHOICES,
                                       source="get_type_display",
                                       read_only=True)  # 设置source="get_属性_display"即可
        project_create_time=serializers.CharField(source='project.create_time')
        name_zidingyi=serializers.SerializerMethodField()
        def get_name_zidingyi(self,obj):
            return obj.project.name
        class Meta:
            model=Test_Interface
            fields='__all__'
    

    Django处理枚举(枚举模型)以及source的使用

    5、案例5

    序列化输出时改变前端输出的字段名称

    Django处理枚举(枚举模型)以及source的使用

    Django处理枚举(枚举模型)以及source的使用


    Django处理枚举(枚举模型)以及source的使用


免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,1167人围观)

还没有评论,来说两句吧...

目录[+]