django restframework serializer 增加自定义字段

在使用django restframework serializer 序列化在django中定义的model时,有时候我们需要额外在serializer中增加一些model中没有的字段。有两种方法实现这个目的。

假设现在有一个Animal模型,其中有name, type, country字段,country为外键。我们在序列化Animal时,需要额外增加外键country的area信息。

方法一:

1.首先,在django的model中定义property

复制代码
class Animal(models.Model):
    name = models.CharField(max_length=50, default='')
    type = models.CharField(max_length=50, default='')
    country = models.ForeignKey(Country, blank=True, null=True)
 
    @property
    def country_area(self):
        return self.country.area
  
复制代码

2.然后在定义django restframework的serializer时,使用字段的source参数指向我们上面定义好的property

class AnimalSerializer(serializers.Serializer):
    pk = serializers.IntegerField(read_only=True)
    name = serializers.CharField(max_length=50)
    type = serializers.CharField(max_length=50)
    country = serializers.PrimaryKeyRelatedField(read_only=True)
    country_area = serializers.FloatField(required=False, source='country_area’)

 

方法二:

不修改django的model,直接使用SerializerMethodField(method_name=None)字段

复制代码
class AnimalSerializer(serializers.ModelSerializer):
    country_area = serializers.SerializerMethodField()
 
    class Meta:
        model = Animal
        fields = ('id', 'name', 'type','country','country_area')
 
    def get_country_area(self, obj):
        return obj.country.area 
复制代码

 

几点说明:

  1. SerializerMethodFiel是一个read-only字段
  2. 当不指定其method_name时,默认为get_<field_name>
  3. 如果使用ModelSerializer并指定字段时,要包含此时定义的字段

 

posted on   星河赵  阅读(1743)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示