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


Django处理枚举-枚举模型

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

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

python 复制代码
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)

python 复制代码
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
python 复制代码
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

序列化器类设计

python 复制代码
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

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

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

序列化器文件:serializers.py

python 复制代码
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__'

3、支持连表查询

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

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

python 复制代码
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__'

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

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

python 复制代码
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__'

5、案例5

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


相关推荐
玄同7655 分钟前
我的 Trae Skill 实践|使用 UV 工具一键搭建 Python 项目开发环境
开发语言·人工智能·python·langchain·uv·trae·vibe coding
@––––––14 分钟前
力扣hot100—系列2-多维动态规划
算法·leetcode·动态规划
Yorlen_Zhang15 分钟前
Python Tkinter Text 控件完全指南:从基础编辑器到富文本应用
开发语言·python·c#
lxl130716 分钟前
C++算法(1)双指针
开发语言·c++
xsyaaaan26 分钟前
代码随想录Day31动态规划:1049最后一块石头的重量II_494目标和_474一和零
算法·动态规划
不绝19128 分钟前
C#进阶:预处理指令/反射,Gettype,Typeof/关键类
开发语言·c#
无小道33 分钟前
Qt-qrc机制简单介绍
开发语言·qt
Anita_Sun35 分钟前
一看就懂的 Haskell 教程 - 类型推断机制
后端·haskell
zhooyu40 分钟前
C++和OpenGL手搓3D游戏编程(20160207进展和效果)
开发语言·c++·游戏·3d·opengl
HAPPY酷43 分钟前
C++ 和 Python 的“容器”对决:从万金油到核武器
开发语言·c++·python