我有一个Object
带有state
日期时间参数的方法的类dt
。如何将日期时间参数从 URL 传递到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})
中作为额外上下文传递。这里的问题是无法通过as未定义访问何时ObjectSerializer
初始化。dt
self.context['dt']
self
解决办法是先做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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句