将上下文传递给 Django Rest Framework 中的 ModelSerializer 字段

问题描述

我正在尝试通过 view一个变量从我的 context 传递到序列化程序。序列化程序应该能够获取上下文变量并在包含嵌套序列化程序的字段中使用它。

由于嵌套的序列化器字段不能是 read_only,所以我不能使用 serializerMethodField

这就是我将上下文传递给序列化程序的方式:

class MyListCreateAPIView(generics.ListCreateAPIView):
    
    # [...]

    def get_serializer_context(self):
        return {
            'request': self.request,'format': self.format_kwarg,'view': self,'asTime': '2021-02-04 16:40:00',# <-- This is my context variable
        }

这是我的序列化程序:

class MySerializer(serialisers.ModelSerializer):
    child = MyChildSerializer(read_only=False,asTime= ??) # <-- here I want to pass the context variable

    class Meta:
         model = MyModel
         fields = '__all__'

我知道我可以使用 self.context.get('asTime') 访问上下文变量,但我无法访问 self 属性(子项)中的 MySerializer。我该怎么做?

解决方法

您可以在 init 上更新孩子的上下文:

def __init__(self,*args,**kwargs):
    super().__init__(*args,**kwargs)        
    self.fields['child'].context.update(self.context)

或者您可以将其捕获在例如 to_representation 中:

 self.parent.context["asTime"]