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

Pass context to ModelSerializer field in Django Rest Framework

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

由于嵌套的序列化器字段不能是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') 访问上下文变量,但我无法访问 MySerializer 属性(子)中的 self。我该怎么做?

您可以在初始化时更新 child 的上下文:

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

或者您可以在 to_representation 中捕获它,例如:

 self.parent.context["asTime"]