シーケンス化使用(django rest framework)
シーケンス化器の使用をdjango shellで学ぶことができます.
1基本使用
1)まず図書の対象を検索する
2)シーケンサオブジェクトの作成
3)シーケンス化データの取得
dataプロパティでシーケンス化されたデータを取得できます
4)複数のデータを含むクエリー・セットQuerySetをシーケンス化する場合は、many=Trueパラメータを追加して説明を補足できます.
2関連オブジェクトのネストされたシーケンス化
シーケンス化が必要なデータに他の関連オブジェクトが含まれている場合は、関連オブジェクトデータのシーケンス化を指定する必要があります.
たとえば、ヒーローデータのシーケンス化器を定義する場合、外部キーhbook(すなわち、所属する図書)フィールドはどのようにシーケンス化されますか?
まず、HeroInfoSerialzierを除くキーフィールドの他の部分を定義します.
関連フィールドについては、次の方法を使用できます.
1) PrimaryKeyRelatedField
このフィールドは、関連オブジェクトのプライマリ・キーとしてシーケンス化されます.
フィールドを指定するときにread_を含める必要がありますonly=Trueまたはquerysetパラメータ: read_を含むonly=Trueパラメータの場合、このフィールドは逆シーケンス化として使用できません. を使用します. querysetパラメータを含む場合、逆シーケンス化時のパラメータチェックとして使用する 効果の使用:
2) StringRelatedField
このフィールドは、関連オブジェクトの文字列表現としてシーケンス化されます(すなわち、__str_メソッドの戻り値)
効果の使用
3)SlugRelatedField
このフィールドは、関連オブジェクトの指定されたフィールドデータとしてシーケンス化されます.
slug_Fieldは、関連オブジェクトを使用するフィールドを指定します.
効果の使用
4)関連付けられたオブジェクトのシーケンサの使用
効果の使用
manyパラメータ
関連付けられたオブジェクトデータが1つだけではなく、複数のデータが含まれている場合、図書BookInfoデータをシーケンス化したい場合、各BookInfoオブジェクトに関連付けられたヒーローHeroInfoオブジェクトが複数ある可能性があります.この場合、関連付けられたフィールドタイプの指定は、関連付けられたフィールドを宣言するときにmany=Trueパラメータを複数追加するだけで、上記の方法を使用できます.
ここでは、PrimaryKeyRelatedFieldタイプのみを例に挙げます.他は同じです.
BookInfoSerializerに関連フィールドを追加します.
効果の使用:
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パラメータ:
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]}