django Serializerプログレッシブ使用方法詳細


Serializerプログレッシブ
Serializerを定義します
1.定義方法
Django REST frame eworkのSerializerはクラスを使って定義します。frame ework.serializer.Serializer。
例えば、私たちはもう一つのデータベースモデルタイプのBookInfoを持っています。

class BookInfo(models.Model):
  btitle = models.CharField(max_length=20, verbose_name='  ')
  bpub_date = models.DateField(verbose_name='    ', null=True)
  bread = models.IntegerField(default=0, verbose_name='   ')
  bcomment = models.IntegerField(default=0, verbose_name='   ')
  image = models.ImageField(upload_to='booktest', verbose_name='  ', null=True)
このモデルクラスにプログレッシブを提供したいです。次のように定義できます。

class BookInfoSerializer(serializers.Serializer):
  """        """
  id = serializers.IntegerField(label='ID', read_only=True)
  btitle = serializers.CharField(label='  ', max_length=20)
  bpub_date = serializers.DateField(label='    ', required=False)
  bread = serializers.IntegerField(label='   ', required=False)
  bcomment = serializers.IntegerField(label='   ', required=False)
  image = serializers.ImageField(label='  ', required=False)
注意:serializerはデータベースモデル類のみの定義ではなく、非データベースモデル類のデータ定義でもあります。serializerはデータベースから独立した存在です。
2.フィールドとオプション
通常のフィールドタイプ:
フィールド
フィールドの作成方法
Boolean Field
Boolean Field()
Null Boolean Field
Null Boolean Field()
Char Field
Char Field(max_)length=None,min_length=None、allow_blank=False、trim_white espace=True)
Email Field
Email Field(max_)length=None,min_length=None、allow_blank=False)
RegexField
RegexField(regex,max_length=None,min_length=None、allow_blank=False)
SlugField
SlugField(maxlength=50,min_length=None、allow_blank=False)
正規フィールド、正規モード[a-zA-Z 0-9-]+を検証します。
URL Field
URL Field(max_length=200,min_length=None、allow_blank=False)
UUUIDField
UUUIDField(format='hex_verbose
フォーマット:
1)'hex_verbose'は、例えば「5 cc 0 e 9 a 5-5 ffa-654 b-cee 0-1238041 fb 31 a」のようです。
2)'hex'は「5 c e 0 a 55 ffa 654 bcee 01238041 fb 31 a」のようです。
3)'int'-例えば:「1234545114 123567812312313131334515145114」
4)'urn'如:“urn:uuid:5 c e 0 a 5-5 ffa-654 b-cee 0-1238041 fb 31 a”
IPAddress Field
IPAddress Field(protocol='both)、unpack_ipv 4=False、*options)
Integer Field
Integer Field(max_value=None,min_value=None)
Flooat Field
Float Field(max_value=None,min_value=None)
Decimal Field
Decimal Field(max_digits,decimal_placeto_string=None、max_value=None,min_value=None)
max_digits:最大桁数
decimal_パルクス:小数点以下の位置
DateTimeField
DateTimeField(format=api_)settings.DATETIME_FOREMAT,input_フォーマット=None)
DateField
DateField(format=api_settings.DATE_FOREMAT,input_フォーマット=None)
TimeField
TimeField(format=api_settings.TIME_FOREMAT,input_フォーマット=None)
Duration Field
Duration Field()
Choice Field
Choice Field(checes)
checesとDjangoの使い方は同じです。
Multiple Choice Field
Multiple Choice Field(checes)
FileField
FileField(max_length=None、allow_empty_file=False、use_url=UP LOADED_FILES_USE_URL)
ImageField
ImageField(max_length=None、allow_empty_file=False、use_url=UP LOADED_FILES_USE_URL)
ListField
ListField(child=、min_length=None、max_length=None)
DictField
DictField(child=)
オプションのパラメータ:
パラメータ名
作用
max_length
最大長さ
min.lenght
最小長さ
allow_ブラック
空で許可するかどうか
trim_ホワイトパス
空白文字を切断しますか?
max_value
最小値
min.value
最大値
共通パラメータ:
パラメータ名
説明
read_.only
このフィールドは、プログレッシブ出力にのみ使用されることを示し、デフォルトのFalse
write_only
このフィールドは、アンチプログレッシブ入力にのみ使用されることを示し、デフォルトのFalse
required
このフィールドは、デフォルトのTrueを入力する必要があります。
default
アンチプログレッシブ時に使用するデフォルト値
allow_null
フィールドがNoneに入ることを許可しているかどうか、デフォルトのFalse
validators
このフィールドで使用する検証器
error_メッセージ
エラー番号とエラー情報を含む辞書
label
APIページをHTMLで表示する場合のフィールド名
help_テキスト
HTMLでAPIページを表示する場合、表示されるフィールドヘルプメッセージ情報
3.Serializerオブジェクトを作成する
Serializerクラスを定義すれば、Serializerオブジェクトを作成できます。
Serializerの構造方法は、

Serializer(instance=None, data=empty, **kwarg)
説明:
1)プログレッシブに使用する場合、モデル類のオブジェクトをinstanceパラメータに導入する
2)アンチプログレッシブに使用すると、デタパラメータに逆プログレッシブになるデータが入ってきます。
3)instanceとdataパラメータの他に、Serializerオブジェクトを構築する際に、contextパラメータで追加データを追加することができます。

serializer = AccountSerializer(account, context={'request': request})
contextパラメータに付加されたデータは、Serializerオブジェクトのcontext属性で取得できます。
プログレッシブ使用
私たちはdjango shellでプログレッシブの使用を学びます。

python manage.py shell
1基本使用
1)まず図書の対象を調べます。

from booktest.models import BookInfo
book = BookInfo.objects.get(id=2)
2)プログレッシブオブジェクトを作成する

from booktest.serializers import BookInfoSerializer
serializer = BookInfoSerializer(book)
3)シーケンスデータの取得
データ属性により、プログレッシブ後のデータを取得できます。

serializer.data
# {'id': 2, 'btitle': '    ', 'bpub_date': '1986-07-24', 'bread': 36, 'bcomment': 40, 'image': None}
4)複数のデータが含まれているクエリセットQuerySetをプログレッシブにするなら、may=Trueパラメータを追加して説明することができます。

book_qs = BookInfo.objects.all()
serializer = BookInfoSerializer(book_qs, many=True)
serializer.data
# [OrderedDict([('id', 2), ('btitle', '    '), ('bpub_date', '1986-07-24'), ('bread', 36), ('bcomment', 40), ('image', N]), OrderedDict([('id', 3), ('btitle', '    '), ('bpub_date', '1995-12-24'), ('bread', 20), ('bcomment', 80), ('image'ne)]), OrderedDict([('id', 4), ('btitle', '    '), ('bpub_date', '1987-11-11'), ('bread', 58), ('bcomment', 24), ('ima None)]), OrderedDict([('id', 5), ('btitle', '   '), ('bpub_date', '1988-01-01'), ('bread', 10), ('bcomment', 10), ('im', 'booktest/xiyouji.png')])]
2連結オブジェクトの入れ子順序化
順序付けが必要なデータに他の関連オブジェクトが含まれている場合は、関連対象データの順序付けには指定が必要です。
例えば、ヒーローデータのプロシージャを定義するとき、外部キーhbookフィールドはどのようにプログレッシブされますか?
まず、HeroInfoSerialzerを除いたキーフィールドの他の部分を定義します。

class HeroInfoSerializer(serializers.Serializer):
  """        """
  GENDER_CHOICES = (
    (0, 'male'),
    (1, 'female')
  )
  id = serializers.IntegerField(label='ID', read_only=True)
  hname = serializers.CharField(label='  ', max_length=20)
  hgender = serializers.ChoiceField(choices=GENDER_CHOICES, label='  ', required=False)
  hcomment = serializers.CharField(label='    ', max_length=200, required=False, allow_null=True)
関連フィールドには、以下のような方法があります。
1)Primary KeyRelated Field
このフィールドは、関連するオブジェクトのプライマリキーとして順序付けされます。

hbook = serializers.PrimaryKeyRelatedField(label='  ', read_only=True)
 
hbook = serializers.PrimaryKeyRelatedField(label='  ', queryset=BookInfo.objects.all())
フィールドを指定するときはread_を含む必要があります。only=Trueまたはquerysetパラメータ:
  • はread_を含む。only=Trueパラメータの場合、このフィールドは逆順序として使用できなくなります。
  • を使用します。
  • にquerysetパラメータが含まれている場合、逆プログレッシブ時のパラメータチェックとして
  • を使用します。
    使用効果:
    
    from booktest.serializers import HeroInfoSerializer
    from booktest.models import HeroInfo
    hero = HeroInfo.objects.get(id=6)
    serializer = HeroInfoSerializer(hero)
    serializer.data
    # {'id': 6, 'hname': '  ', 'hgender': 1, 'hcomment': '     ', 'hbook': 2}
    
    2)StringRelated Field
    このフィールドは、関連するオブジェクトの文字列表示方法として順序付けされます。str方法の戻り値)
    
    hbook = serializers.StringRelatedField(label='  ')
    効果を使う
    ''id':6,hname':'喬峰',hgender':1,hcompment':'降龍十八掌',hbook':'天龍八部''
    3)Hyperlinked Related Field
    このフィールドは、関連するオブジェクトデータを取得するインターフェースリンクとして順序付けされます。
    
    hbook = serializers.HyperlinkedRelatedField(label='  ', read_only=True, view_name='books-detail')
    必ずviewを明示しなければならないnameパラメータは、DRFがビューの名前に従ってルートを探し、さらに完全なURLに接続するためです。
    効果を使う
    ''id':6,hname':'喬峰',hgender':1,hcompment':'降龍十八掌','hbook':'http://127.0.0.1:8000/books/2/'。
    私たちはまだビューを定義していません。この方法はもう見せません。
    4)SlugRelated Field
    このフィールドは、関連するオブジェクトの指定フィールドデータとして順序付けされます。
    
    hbook = serializers.SlugRelatedField(label='  ', read_only=True, slug_field='bpub_date')
    
    スラグ.fieldは、関連するオブジェクトを使用するフィールドを指定します。
    効果を使う
    {id':6,hname':'喬峰',hgender':1,hcompment':'降龍十八掌',hbook':datetime.date(1986,7,24)}
    5)関連するオブジェクトを使用するプログレッシブ
    
    hbook = BookInfoSerializer()
    
    効果を使う
    ''id':6,hname':'喬峰',hgender':1,'hcommment':'降龍十八掌','hbook':Orderedict(',2),('btitle',天龍八部')te',1986-07-24'),(imebred',40),(comple',mute',mute',mute),(36),'
    6)to_を書き直すrepresentation方法
    プログレッシブの各フィールドは、実際にはこのフィールドタイプのto_である。representation方法でフォーマットを決定する場合、この方法を書き換えることでフォーマットを決定することができます。
    注意してくださいrepresentations方法は、関連するオブジェクトフォーマットを制御するだけではなく、各プログレッシブフィールドタイプに適用されます。
    新しい関連フィールドをカスタマイズ:
    
    class BookRelateField(serializers.RelatedField):
      """            """
      def to_representation(self, value):
        return 'Book: %d %s' % (value.id, value.btitle)
    
    hbookを指定するのはBookRelateFieldタイプです。
    
    hbook = BookRelateField(read_only=True)
    効果を使う
    ''id':6,hname':'喬峰',hgender':1,hcompment':'降龍十八掌',hbook':'2天龍八部''
    パラメータ
    関連するオブジェクトデータが1つだけではなく、複数のデータを含んでいる場合、ブックブックBook Infoデータを順次列挙したい場合、各BookInfoオブジェクトに関連するヒーローHero Infoオブジェクトは複数あるかもしれません。この場合、関連フィールドタイプの指定は上記のようないくつかの方法が適用されます。ただし、関連フィールドを宣言する際には、many=Trueパラメータを追加すれば良いです。
    ここではPrimary KeyRelatedタイプのみを例に挙げます。他は同じです。
    BookInfoSerializerに関連フィールドを追加します。
    
    class BookInfoSerializer(serializers.Serializer):
      """        """
      id = serializers.IntegerField(label='ID', read_only=True)
      btitle = serializers.CharField(label='  ', max_length=20)
      bpub_date = serializers.DateField(label='    ', required=False)
      bread = serializers.IntegerField(label='   ', required=False)
      bcomment = serializers.IntegerField(label='   ', required=False)
      image = serializers.ImageField(label='  ', required=False)
      heroinfo_set = serializers.PrimaryKeyRelatedField(read_only=True, many=True) #   
    
    使用効果:
    
    from booktest.serializers import BookInfoSerializer
    from booktest.models import BookInfo
    book = BookInfo.objects.get(id=2)
    serializer = BookInfoSerializer(book)
    serializer.data
    # {'id': 2, 'btitle': '    ', 'bpub_date': '1986-07-24', 'bread': 36, 'bcomment': 40, 'image': Non
    
    
    以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。