簡體   English   中英

如何修改 django rest 框架發送的響應

[英]How can modify response send by django rest framework

我使用Django REST as backend和 angular 作為前端。

我有兩個序列化程序,一個用於 readong GET 請求,另一個用於 POST、PUT 請求。

這是因為我在interval中輸入的字段很少,例如用戶,但在數據庫中我保存為 timedelta,所以我必須將它們相乘以使它們成為前端的秒數。

因此,例如用戶輸入的interval = 5 ,我將5*60*60發布到服務器。

為了閱讀,我制作了ReadSerializer ,我將其潛水 60*60 以再次向用戶顯示他添加的內容。

這是工作發現我的問題是在將我的 object 保存到數據庫后 djnago rest 框架發送 object 因為它被保存為 06,其interval = 5*60*60 inerval 只是一個例子,有 4-5 個字段,我在發布之前在前端更改它們

有沒有什么方法可以讓響應READ serializer before sending程序

class Serializer(serializers.ModelSerializer):
    interval = serializers.SerializerMethodField('get_interval')

    class Meta:
        model = User
        fields = ('id', 'interval')

    def get_interval(self, obj):
        return obj.interval/60*60

class WriteSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('id', 'interval')

這是視圖

class UserListCreateView(generics.ListCreateAPIView):
    queryset = User.objects.filter(is_deleted=False)

    def get_serializer_class(self):
        if self.request.method == 'GET':
            return ReadSerializer
        return WriteSerializer

您可以使用transform_field方法,該方法允許您在顯示字段時自定義字段的表示形式。

有關它的文檔: http//www.django-rest-framework.org/api-guide/serializers/#customizing-field-representation

順便說一下,如果你打算升級到drf(> = 3)的新版本,請注意這些方法可能會消失,轉而采用獨特的to_representation方法: httpsto_representation to_representationtopic / Django的休息框架/ 9kp5kXCssR4

我只是在前端的 JavaScript 中更改它。 但是我有一個類似的問題並像這樣解決了它,(警告,我剛開始使用 DRF,所以可能不是最好的方法):

只需直接更改方法的響應,首先獲取原始響應,然后編輯它的data屬性,這是要返回的數據的 dict(預序列化):

class UserListCreateView(generics.ListCreateAPIView):
    ...

    def list(self, request, *args, **kwargs):
            response = super().list(request, *args, **kwargs)
            response.data['interval'] = response.data['interval'] / 60 / 60
            return response

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM