在查询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())