2017-02-02 74 views

回答

4

反序列化

數據被輸入到串行 如

serializer = CommentSerializer(data={'email': 'foobar', 'content': 'baz'})

正如你所看到的電子郵件是無效的,所以下面的規則(官方docmentation)

申請

反序列化數據時,您總是需要在之前調用is_valid()試圖訪問驗證的數據,或保存一個對象實例

serializer.is_valid() 

如果你試圖反序列化data有效#True那麼你可以爲

serializer.validated_data 

加成

訪問驗證數據

驗證後沒有數據轉換,它只檢查您的數據是否有效,如果發生任何驗證錯誤,.errors屬性將包含一個代表結果錯誤消息的字典。

一個很好的例子是,當你在做現場驗證

class CommentSerializer(serializers.Serializer): 
    title = serializers.CharField(max_length=100) 

    def validate_title(self, value): 
     if 'django' not in value.lower(): 
      raise serializers.ValidationError("Title is not about Django") 
     return value 

validate_title會在每次調用.is_valid()時候叫,你可以看到它只是檢查標題Django的關係,如果真值,在這種案例標題被返回,否則引發ValidationError。此處沒有數據變化

+0

這並不回答這個問題。數據總是會與經過驗證的數據一樣? – user2080105

+0

我編輯了我的答案。希望其明確@ user2080105 –

+0

你有任何官方消息來源提到沒有轉型? – user2080105

2

您可以在CommentSerializer中自定義數據。validate_content方法:

這是您的串行:

class CommentSerializer(serializers.Serializer): 
    email=serializers.EmailField() 
    content=serializers.CharField() 
    def validate_content(self,value): 
     #If content is 'baz' returns 'foo' 
     if value and value == "baz": 
      return "foo" 
     return value 

所以: 讓我們嘗試與錯誤的值(電子郵件)

>>> serializer = CommentSerializer(data={'email': 'foobar', 'content': 'baz'}) 

>>> serializer.data 
Traceback (most recent call last): 
    raise AssertionError(msg) 
AssertionError: When a serializer is passed a `data` keyword argument you must call `.is_valid()` before attempting to access the serialized `.data` representation. 
You should either call `.is_valid()` first, or access `.initial_data` instead. 

>>> serializer.initial_data 
{'content': 'baz', 'email': 'foobar'} 

>>> serializer.validated_data 
Traceback (most recent call last): 
    raise AssertionError(msg) 
AssertionError: You must call `.is_valid()` before accessing `.validated_data`. 

>>> serializer.is_valid() 
False 

>>> serializer.data 
{'content': 'baz', 'email': 'foobar'} 

>>> serializer.validated_data 
{} 

>>> serializer.errors 
{'email': [u'Enter a valid email address.']} 

現在讓我們嘗試用正確的值

>>> serializer2 = CommentSerializer(data={'email': '[email protected]', 'content': 'baz'}) 
>>> serializer2.is_valid() 
True 

>>> serializer2.initial_data 
{'content': 'baz', 'email': 'foobar'} 

>>> serializer2.errors 
{} 

>>> serializer2.data 
{'content': u'foo', 'email': u'[email protected]'} 

>>> serializer2.validated_data 
OrderedDict([(u'email', u'[email protected]'), (u'content', u'foo')]) 

所以:

  • 數據:是一個字典,你可以看到它後,才is_valid()(你只能看到未驗證值)
  • validated_data是OrderedDict你只能後is_valid看到它() & & is_valid()==真
相關問題