修改Django Rest Framework请求

4

我有一个 Django rest framework 的 API 设置,现在想把当前时间插入到传入的 PUT 请求中。目前我的代码如下:

class ItemViewSet(viewsets.ModelViewSet):
    queryset = Item.objects.filter(done = False).order_by('-time')
    serializer_class = ItemSerializer
    paginate_by = None

    def list(self, request, *args, **kwargs):
        self.object_list = self.filter_queryset(self.get_queryset())
        serializer = self.get_serializer(self.object_list, many=True)
        return Response({'results': serializer.data})

这个处理方式可以实现部分更新,但我想发送一个请求,将Item设置为done = True,并且在发送给序列化程序的数据中也插入一个UNIX时间戳。我能像这样更改request对象吗?还是有更好的方法?

def put(self, request, *args, **kwargs):
    request.data['time'] = time.time()
    return self.partial_update(request, *args, **kwargs)

你的模型和序列化器长什么样? - dvnguyen
2个回答

4

不要修改请求,而是重写序列化器的update方法。

Class ItemlSerializer(serializers.ModelSerializer):
    class Meta:
        model = ItemModel
        fields = '__all__'
        read_only_fields = ('time',)

    def update(self, instance, validated_data):
        instance.time = time.time()
        return super().update(instance, validated_data)

1

你可以创建一个父序列化器Mixin,其中包含一个序列化器方法字段。然后,所有的序列化器都可以继承这个序列化器Mixin。

class TimeStampSerializerMixin(object):
    timestamp = serializers.SerializerMethodField()


    def get_timestamp((self, obj):
        return str(timezone.now())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接