【问题标题】:Pass parameter to Django REST framework serializer to use with model将参数传递给 Django REST 框架序列化程序以与模型一起使用
【发布时间】:2017-08-24 08:00:07
【问题描述】:

我有一个类Object,其方法state 采用日期时间参数dt。如何将 URL 中的 datetime 参数传递给Object.state()

型号:

class Object(models.Model):
    def state(self, dt=datetime.datetime.now()) -> dict:
        ...stuff...
        return {'dt': dt, 'other_stuff': stuff}

观点:

class ObjectDetail(generics.RetrieveAPIView):
    queryset = models.Object.objects.all()
    serializer_class = serializers.ObjectSerializer

    def get_serializer_context(self):
        return {'dt': self.request.query_params.get('dt', datetime.datetime.now())}

    def get(self, request, *args, **kwargs):
        return self.retrieve(request, *args, **kwargs)

还有序列化器类:

class ObjectSerializer(serializers.HyperlinkedModelSerializer):
    state = StateSerializer(read_only=True, context={'dt': self.context['dt']})

    class Meta:
        model = models.Object
        fields = ('state')

class StateSerializer(serializers.Serializer):
    dt = serializers.DateTimeField()
    ... other stuff...

如您所见,我试图将dt 作为state = StateSerializer(read_only=True, context={'dt': dt}) 行中的额外上下文传递,并在视图中较早地设置了上下文。这里的问题是当ObjectSerializer 被初始化时,dt 不能通过self.context['dt'] 访问,因为self 没有定义。

【问题讨论】:

  • state 的目的是什么?是每次保存对象都更新还是有别的想法?
  • @wencakisa state 依赖于传递的dt。它是从对象状态和其他事物生成的,是一个字典。它不可写。

标签: django django-rest-framework django-serializer


【解决方案1】:

解决办法是把state做成serializers.SerializerMethodField(),然后定义一个get_state方法。新的ObjectSeializer 如下所示:

class ObjectSerializer(serializers.HyperlinkedModelSerializer):
    state = serializers.SerializerMethodField()

    class Meta:
        model = models.Object
        fields = ('state')

    def get_state(self, obj):
        state = obj.state(self.context['dt'])
        state_serializer = StateSerializer(state)
        return state_serializer.data

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    相关资源
    最近更新 更多