2017-02-02 10 views
1

django rest frameworkは、検証後にどのような変換を行いますか?可能であれば文字列をintに解析するだけですか?データとdjango restフレームワークで検証されたデータの違いは何ですか?

+0

あなたのタイトルはあなたのコンテンツとは異なる問題があります。それは何ですか? – Linovia

+1

"入力と出力の違いは何ですか?" - 広すぎる – Sayse

+0

変換を理解することは詳細の違いを知ることにつながりますが、実際は同じ質問です – user2080105

答えて

4

デシリアライズ

あなたは電子メールが間違っているので、次のルールが

(公式docmentationから)適用見ることができるようにデータが例えば

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

シリアライザ に入力され、

データをデシリアライズするときは、必ずの前にis_valid()を呼び出す必要があります。 dataあなたがデシリアライズしようとしているが、その後、あなたが

serializer.validated_data 

ADDITION

として検証データにアクセスできる有効な #Trueある場合

serializer.is_valid() 

を検証したデータにアクセスする、またはオブジェクトのインスタンスを保存しようと

検証後にデータ変換が行われない場合は、データが有効かどうかをチェックし、検証エラーが発生した場合は.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()を呼び出すたびに呼び出されますときTrueの値大文字小文字のタイトルが返されます。それ以外の場合は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')]) 

てみましょうのは、間違った値(Eメール)で試してみましょうSo:

  • データ:辞書であり、あなたは(だけIS_VALID後にそれを見ることができます)(あなただけ検証されない値を参照することができます)
  • validated_dataがOrderedDictで、あなただけのIS_VALID後にそれを見ることができます() & & IS_VALID()==真
関連する問題