You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django REST Framework中自动序列化多继承模型?

Django 模型继承下的自动序列化方案

问题场景

你的模型采用三层继承结构(祖父类Main → 父类Category → 多个孙类SubCategory1/SubCategory2),需要在API中自动返回从祖父到孙类的完整字段,避免为每个孙类手动编写序列化器。

模型结构(修正拼写错误后):

from django.db import models

class Main(models.Model):
    name = models.CharField(max_length=50)
    # 其他字段...

class Category(Main):
    type = models.CharField(max_length=50)
    # 其他字段...

class SubCategory1(Category):
    characteristic = models.CharField(max_length=60)
    # 其他字段...

class SubCategory2(Category):
    characteristic = models.CharField(max_length=60)
    # 其他字段...

解决方案

方法1:动态生成序列化器

编写一个工具函数,自动收集模型及其所有父类的字段,动态生成对应的序列化器:

from rest_framework import serializers
from django.db import models

def get_dynamic_serializer(model_class):
    # 递归收集当前模型及所有父类的字段
    all_fields = []
    current_model = model_class
    # 终止条件:直到追溯到最顶层的Model类
    while current_model != models.Model:
        # 添加当前模型的所有字段名
        all_fields.extend([field.name for field in current_model._meta.fields])
        # 向上追溯父类模型
        current_model = current_model._meta.base_model
    
    # 去重,避免父类字段重复出现
    all_fields = list(dict.fromkeys(all_fields))

    # 动态定义序列化器类
    class DynamicSerializer(serializers.ModelSerializer):
        class Meta:
            model = model_class
            fields = all_fields

    return DynamicSerializer

使用方式

当需要序列化某个孙类时,直接调用函数生成序列化器:

# 生成SubCategory1的序列化器
sub1_serializer = get_dynamic_serializer(SubCategory1)
# 序列化实例
data = sub1_serializer(SubCategory1.objects.all(), many=True).data

方法2:基类序列化器自动适配子类

如果视图中需要统一处理Category层级的实例(多表继承下,Category的实例实际是各个孙类的对象),可以写一个基类序列化器,自动识别实例的实际类型并序列化:

class CategoryBaseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = "__all__"

    def to_representation(self, instance):
        # 根据实例的实际类型,动态获取对应序列化器
        serializer_class = get_dynamic_serializer(instance.__class__)
        return serializer_class(instance).data

使用方式

在视图中直接使用这个基类序列化器即可:

from rest_framework.views import APIView
from rest_framework.response import Response

class CategoryListView(APIView):
    def get(self, request):
        queryset = Category.objects.all()
        serializer = CategoryBaseSerializer(queryset, many=True)
        return Response(serializer.data)

这样返回的JSON会自动包含Main、Category以及对应孙类的所有字段,无需为每个孙类单独编写序列化器。


内容的提问来源于stack exchange,提问作者javistro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 14:43:12