![](/img/trans.png)
[英]django-rest-framework: Cannot call `.is_valid()` as no `data=` keyword argument was passed when instantiating the serializer instance
[英]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.