如何在DRF序列化器中使用独立自定义函数作为字段而非SerializerMethodField
Django REST Framework 独立函数作为序列化字段实现方案
不用SerializerMethodField的前提下,有两种常用实现方式:
方案1:模型属性+内置只读字段(改动最小)
适合可以接受少量修改模型代码的场景:
- 给目标模型追加调用独立函数的property属性:
from django.db import models # 你的原有独立函数 def function_a(model): return [{'a1': 'xxx'} , {'a2': 'xxx'}] class ModelA(models.Model): # 原有模型字段 # ... @property def field_a_value(self): return function_a(self)
- 序列化器直接使用
ReadOnlyField指定source对应上述属性即可,如果返回结构固定,还可以搭配嵌套序列化器做类型校验:
from rest_framework import serializers # 可选:定义嵌套序列化器校验返回的列表项结构 class AItemSerializer(serializers.Serializer): a1 = serializers.CharField(read_only=True) a2 = serializers.CharField(read_only=True) class ExampleSerializer(serializers.HyperlinkedModelSerializer): # 基础写法,直接返回函数原始返回值 # field_A = serializers.ReadOnlyField(source='field_a_value') # 带结构校验的写法 field_A = AItemSerializer(many=True, read_only=True, source='field_a_value') class Meta: model = models.ModelA fields = ['field_A']
方案2:自定义通用函数字段(无侵入模型)
适合不想修改模型代码、需要复用函数的场景:
- 先实现通用的函数字段类:
from rest_framework import serializers class FunctionBindingField(serializers.Field): def __init__(self, func, **kwargs): self.func = func kwargs['read_only'] = True super().__init__(**kwargs) def to_representation(self, instance): # 直接把模型实例传入传入的独立函数执行并返回结果 return self.func(instance)
- 序列化器直接传入独立函数使用即可,无需修改模型代码:
class ExampleSerializer(serializers.HyperlinkedModelSerializer): field_A = FunctionBindingField(func=function_a) class Meta: model = models.ModelA fields = ['field_A']
内容的提问来源于stack exchange,提问作者Ajax
相关产品推荐
相关产品推荐

