簡體   English   中英

覆蓋 Django-Rest-Framework 序列化程序 is_valid 方法

[英]Overriding Django-Rest-Framework serializer is_valid method

我有一個關於覆蓋is_valid的快速問題。 Self 是一個rest_framework.serializers.ModelSerializer 我試圖弄清楚是否有比讀取/寫入data._kwargs屬性更好的方法來修改內部數據。 我知道我可以通過self.get_initial()調用獲得數據預驗證。 但我也希望能夠寫入數據。 這里的目的是將圖像數據(如果格式不正確)更改為我們的模型接受的格式,以便我們的 API 更加靈活。 我知道可能還有其他方法可以實現我的目標,但我的一般問題是

在調用 is_valid() 之前,是否有在序列化程序上設置數據的好方法?

因為它也適用於其他情況。 謝謝!

def is_valid(self, raise_exception=True):
    imageHandler = ImageHandler()
    if "member_profile" in self._kwargs["data"]:
        if "profile_image" in self._kwargs["data"]["member_profile"]:
            self._kwargs["data"]["member_profile"]["profile_image"] = imageHandler.convertImage(
                self._kwargs["data"]["member_profile"]["profile_image"])
    else:
        self._kwargs["data"]["member_profile"] = {}
    valid = super(AuthUserModelSerializer, self).is_valid(raise_exception=raise_exception)
    return valid

就個人而言,我會為 profile_image(或擴展圖像字段)編寫一個自定義字段並覆蓋 to_internal_value 方法來保存此自定義邏輯。 這將在字段驗證期間調用。 這是一個偽示例:

class ProfileImageField(ImageField):

    def to_internal_value(self, data):
       converted = ImageHandler().convertImage(data)
       return super(ProfileImageField,self).to_internal_value(converted)

為了回答您的通用問題,我通常對字段和序列化程序使用自定義 to_internal_value() 方法來處理傳入數據和預期數據之間的任何差異。 這些方法在驗證期間運行,並允許您以明顯的方式控制數據,以便將來閱讀您的代碼的人。

澄清


序列化程序本身有一個“to_interval_value”方法,它允許您在序列化程序的數據驗證期間(但在驗證數據本身之前)修改/處理您傳遞給它的數據。 此時修改數據也將發生在字段級驗證之前。 因此,如果您想將傳遞到端點的字段重命名為您期望的名稱,或者如果您想為尚未在數據中傳遞的字段添加空值,這將是您執行此操作的地方.

class MySerializer(serializers.ModelSerializer):

    def to_internal_value(self, data):
       if 'member_profile' not in data:
           data['member_profile'] = {}
       return super(MySerializer,self).to_internal_value(data)

暫無
暫無

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

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