Django REST框架嵌套ModelSerializer
这和我之前的问题有关
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 个回答
在创建MyBaseModelSerializer
的时候,它并不知道mybasemodel_set
的查询集或实例。它只知道它的父类序列化器OtherModelSerializer
。
当用数据初始化OtherModelSerializer
时,比如在序列化或反序列化的过程中,mybasemodel_set
的查询集或实例才会被传入。这时,OtherModelSerializer
会根据提供的实例或查询集来获取与mybasemodel_set
相关的对象。
如果你想改变MyBaseModelSerializer
在接收mybasemodel_set
相关对象时的行为,你可以在MyBaseModelSerializer
中重写一些方法,比如to_representation()
或to_internal_value()
。
这一行
mybasemodel_set = MyBaseModelSerializer(many=True)
会初始化一个名为 MyBaseModelSerializer
的类实例,并将 many=True
作为参数传入。
那么,MyBaseModelSerializer
是怎么得到查询集或实例的呢?
我不太确定你想要做什么,但很可能
class MyBaseModelSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
pass
就是你需要的那个函数。你会得到一个实例,并且需要返回序列化的数据。