Django REST框架嵌套ModelSerializer

9 投票
2 回答
2479 浏览
提问于 2025-04-18 08:46

这和我之前的问题有关
django-rest-framework,多表模型继承,ModelSerializers 和嵌套序列化器

在 Django REST 框架中,我们可以这样定义嵌套模型序列化器

class OtherModelSerializer(serializer.ModelSerializer):
    mybasemodel_set = MyBaseModelSerializer(many=True)

    class Meta:
        model = OtherModel

当我们创建一个 OtherModelSerializer 时,MyBaseModelSerializer 会在 __init__ 方法运行之前被实例化。 我认为会这样是因为如果我重写 MyBaseModelSerializer 的 __init__() 方法并检查 "instance",它的值是 None。

我的问题是,MyBaseModelSerializer 是在什么时候以及如何获取 mybasemodel_set 的查询集或实例的?

我的目标是重写我们执行此操作时发生的事情。

2 个回答

0

在创建MyBaseModelSerializer的时候,它并不知道mybasemodel_set的查询集或实例。它只知道它的父类序列化器OtherModelSerializer

当用数据初始化OtherModelSerializer时,比如在序列化或反序列化的过程中,mybasemodel_set的查询集或实例才会被传入。这时,OtherModelSerializer会根据提供的实例或查询集来获取与mybasemodel_set相关的对象。

如果你想改变MyBaseModelSerializer在接收mybasemodel_set相关对象时的行为,你可以在MyBaseModelSerializer中重写一些方法,比如to_representation()to_internal_value()

0

这一行

mybasemodel_set = MyBaseModelSerializer(many=True)

会初始化一个名为 MyBaseModelSerializer 的类实例,并将 many=True 作为参数传入。


那么,MyBaseModelSerializer 是怎么得到查询集或实例的呢?

我不太确定你想要做什么,但很可能

class MyBaseModelSerializer(serializers.ModelSerializer):
     def to_representation(self, instance):
         pass

就是你需要的那个函数。你会得到一个实例,并且需要返回序列化的数据。

http://www.django-rest-framework.org/api-guide/serializers/#overriding-serialization-and-deserialization-behavior

撰写回答