【发布时间】: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