【Django】增加一个自定义字段

在查询GET的结果里增加自定义字段,这个字段只展示;

这样的字段通常有:枚举类型的、外键、其它查询内容;

枚举类型

1、在models.py里枚举类型的数据通常要使用 大写的字段名称 + _CHOICES 来表示;

python 复制代码
class Snort(CoreModel):
    STATUS_CHOICES = [
        (0, "禁用"),
        (1, "启用"),
        (2, "测试"),
        (3, "NDR启用"),
        (4, "自定义"),
    ]
    status = models.IntegerField(choices=STATUS_CHOICES, verbose_name="启用状态", default=0, help_text="启用状态")    

2、此外还需要在序列化时增加对枚举类型数据的处理,为什么source="get_status_display"记住 get_ + 字段名称 + _display 就行了,Django会解析这个成对应的枚举代表的显示值

python 复制代码
class SnortSerializer(CustomModelSerializer):
    """序列化器"""
    status_value = serializers.CharField(source="get_status_display", max_length=11, read_only=True)

外键类型

使用外键类型的数据时 数据库里的字段名称是 project_id 比代码上的字段名称多了一个 _id 或者说是 _主键 当然这个主键不是id时例如是md5时 就是 project_md5;

这个参数to是对应模型的类

python 复制代码
class Snort(CoreModel):
    project = models.ForeignKey(to='Project', verbose_name='项目', help_text="项目", null=True, on_delete=models.SET_NULL, db_constraint=False)

对应的 Project 模型的类

python 复制代码
class Project(CoreModel):
    name = models.CharField(max_length=100, null=False, verbose_name="项目名称", help_text="项目名称")

    class Meta:
        db_table = table_prefix_in + "project"
        verbose_name = '项目'
        verbose_name_plural = verbose_name
        ordering = ('id',)

还要在序列化里增加上,hasattr是判断对象有无这个属性,使用外键时查询结果附带了另一个表的对象

python 复制代码
class SnortSerializer(CustomModelSerializer):
    """序列化器"""
    project_name = serializers.SerializerMethodField(read_only=True)

    def get_project_name(self, instance):
        if hasattr(instance, 'project') and hasattr(instance.project, 'name'):
            return instance.project.name
    #class Meta 和其它添加的字段未显示

添加其他

和前边外键类似,这个是根据外键类型的的修改得到的,通常要添加的字段和这条数据是有相关性的,在添加时首先根据这条数据的内容查询其他数据库;如何获取到这条数据呢:

这个get_project_name(instance)在哪里调用了?

python 复制代码
    
class SnortSerializer(CustomModelSerializer):
    """序列化器"""
    have_pcap = serializers.SerializerMethodField(read_only=True)

    def get_have_pcap(self, obj):
        return bool(PcapSidFile.objects.filter(sid=obj.sid).first())
相关推荐
诺伦4 小时前
OpenAI Agents API 公测拆解:托管编排+持久会话+自有沙箱搭一条自动增长流水线 | RiseClaw玄策
python·openai·ai agent·营销自动化·agent编排
JavaGuide4 小时前
DeepSeek Harness 重磅更新,Codex、Claude Code 子智能体进官方插件列表了,还有 Git 工作树和思考翻译!
前端·后端
坊钰4 小时前
【LangGraph框架入门级】2. 图核心概念:State、Node、Edge 与 Reducers
python·ai编程·langgraph
wewowilling4 小时前
AI大模型开发--01Python基础(无废话)
开发语言·python·函数
小猴子爱上树4 小时前
跨境电商AI图片翻译工具:批量图片翻译、视频字幕翻译与智能抠图一站式解决
大数据·人工智能·python·音视频
5G微创业4 小时前
去除抖音视频水印的Python实现
python·微信小程序·去水印
WeiXin_DZbishe4 小时前
基于微信小程序的本地闲置物品交易平台-计算机毕设 附源码【课程设计】26825
vue.js·spring boot·python·微信小程序·架构·php·课程设计
M--Y5 小时前
LangChain 提示工程:少样本提示与输出解析器
python·langchain·大模型·llm·输出解析器·少样本提示
朱包林5 小时前
iTerm2终端配置指南
linux·javascript·python·云原生·容器·kubernetes·云计算
棉猴5 小时前
玩游戏学Python5-函数
开发语言·python·函数·玩游戏·游戏编程