シーケンス化使用(django rest framework)


シーケンス化器の使用を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)シーケンス化データの取得
dataプロパティでシーケンス化されたデータを取得できます
serializer.data
# {'id': 2, 'btitle': '    ', 'bpub_date': '1986-07-24', 'bread': 36, 'bcomment': 40, 'image': None}

4)複数のデータを含むクエリー・セットQuerySetをシーケンス化する場合は、many=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(すなわち、所属する図書)フィールドはどのようにシーケンス化されますか?
まず、HeroInfoSerialzierを除くキーフィールドの他の部分を定義します.
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) PrimaryKeyRelatedField
このフィールドは、関連オブジェクトのプライマリ・キーとしてシーケンス化されます.
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) StringRelatedField
    このフィールドは、関連オブジェクトの文字列表現としてシーケンス化されます(すなわち、__str_メソッドの戻り値)
    hbook = serializers.StringRelatedField(label='  ')
    

    効果の使用
    {'id': 6, 'hname': '  ', 'hgender': 1, 'hcomment': '     ', 'hbook': '    '}
    

    3)SlugRelatedField
    このフィールドは、関連オブジェクトの指定されたフィールドデータとしてシーケンス化されます.
    hbook = serializers.SlugRelatedField(label='  ', read_only=True, slug_field='bpub_date')
    

    slug_Fieldは、関連オブジェクトを使用するフィールドを指定します.
    効果の使用
    {'id': 6, 'hname': '  ', 'hgender': 1, 'hcomment': '     ', 'hbook': datetime.date(1986, 7, 24)}
    

    4)関連付けられたオブジェクトのシーケンサの使用
    hbook = BookInfoSerializer()
    

    効果の使用
    {'id': 6, 'hname': '  ', 'hgender': 1, 'hcomment': '     ', 'hbook': OrderedDict([('id', 2), ('btitle', '    ')te', '1986-07-24'), ('bread', 36), ('bcomment', 40), ('image', None)])}
    

    manyパラメータ
    関連付けられたオブジェクトデータが1つだけではなく、複数のデータが含まれている場合、図書BookInfoデータをシーケンス化したい場合、各BookInfoオブジェクトに関連付けられたヒーローHeroInfoオブジェクトが複数ある可能性があります.この場合、関連付けられたフィールドタイプの指定は、関連付けられたフィールドを宣言するときにmany=Trueパラメータを複数追加するだけで、上記の方法を使用できます.
    ここでは、PrimaryKeyRelatedFieldタイプのみを例に挙げます.他は同じです.
    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': None, 'heroinfo_set': [6,8, 9]}