Django REST Frameworkの書き込み可能ネストモデルのシーケンス化
13321 ワード
DRF書き込み可能なネスト(DRF Writable Nested)DRF Writable Nestedは、Django RESTフレームワークの書き込み可能なネストモデルシーケンサであり、関連するネストデータを使用してモデルを作成/更新できます.OneToOne(direct/reverse)----一対一(直接/逆)ForeignKey(direct/reverse)----一対多(直接/逆)ManyToMany(direct/reverse excluding m 2 m relations with through model)----多対多(直接/逆はモデルを通るm 2 m関係を含まない)GenericRelation(this always only reverse)----一般関係をサポート(これは常に逆)Requirements(需要)Python(2.7,3.5,3.6)Django(1.9,1.10,1.11,2.0)djangorestframework(3.5+)Installation(インストール)
[Shell]テキスト表示
?
1
Usage(使用方法)たとえば、次のモデル構造について説明します.
[Python]純テキスト表示
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
次のシーケンサのリストを作成する必要があります.
[Python]純テキスト表示
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
また、論理の作成または更新のみをサポートする場合は、このパッケージのNestedCreateMixinまたはNestedUpdateMixinを使用します.たとえば、次のネストされたフィールドに関連するデータをプライマリ・シーケンサに渡すことができます.
[Python]純テキスト表示
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
このシーケンス化器は、すべてのネストされた関係を自動的に作成し、埋め込まれたデータを含む完全なインスタンスを受信します.
[Python]純テキスト表示
?
1 2
[Python]純テキスト表示
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
ベース・シーケンサのsaveメソッドを呼び出すことで、ネストされたシーケンサに値を渡すこともできます.これらのkwargはdictタイプでなければなりません.
[Python]純テキスト表示
?
1 2 3 4 5 6 7
[Python]純テキスト表示
?
1
注:同じ値は、デフォルトなどのすべてのネストされたインスタンスに使用されますが、優先度は高くなります.既知のソリューション問題の更新時に一意のフィールドを持つネストされたシーケンス化器の検証問題この問題を解決できる特別なmixin単一フィールドsmixinがあります.mixinはuniquevalidatorを検証フェーズから保存フェーズに移動します.詳細を知りたい場合は、関連する質問や記事を読むことができます.https://github.com/beda-software/drf-writable-nested/issues/1 http://www.django-rest-framework.org/api-guide/validators/#updating-nested-serializersで使用する例:
[Python]純テキスト表示
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18
注:UniqueFieldsMixinは、一意のフィールドを持つシーケンス化プログラムにのみ適用する必要があります.Mixin ordering Mixin(UniqueFieldsMixinとNestedCreateMixinまたはNestedUpdateMixin)を同時に使用する場合は、UniqueFieldsMixinを前面に配置する必要があります.例:
[Python]純テキスト表示
?
1 2
(記事転載元https://www.jianshu.com/p/c057877d26e1)
[Shell]テキスト表示
?
1
pip
install
drf-writable-nested
Usage(使用方法)たとえば、次のモデル構造について説明します.
[Python]純テキスト表示
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
from
django.db
import
models
class
Site(models.Model):
url
=
models.CharField(max_length
=
100
)
class
User(models.Model):
username
=
models.CharField(max_length
=
100
)
class
AccessKey(models.Model):
key
=
models.CharField(max_length
=
100
)
class
Profile(models.Model):
sites
=
models.ManyToManyField(Site)
user
=
models.OneToOneField(User)
access_key
=
models.ForeignKey(AccessKey, null
=
True
)
class
Avatar(models.Model):
image
=
models.CharField(max_length
=
100
)
profile
=
models.ForeignKey(Profile, related_name
=
'avatars'
)
次のシーケンサのリストを作成する必要があります.
[Python]純テキスト表示
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
from
rest_framework
import
serializers
from
drf_writable_nested
import
WritableNestedModelSerializer
class
AvatarSerializer(serializers.ModelSerializer):
image
=
serializers.CharField()
class
Meta:
model
=
Avatar
fields
=
(
'pk'
,
'image'
,)
class
SiteSerializer(serializers.ModelSerializer):
url
=
serializers.CharField()
class
Meta:
model
=
Site
fields
=
(
'pk'
,
'url'
,)
class
AccessKeySerializer(serializers.ModelSerializer):
class
Meta:
model
=
AccessKey
fields
=
(
'pk'
,
'key'
,)
class
ProfileSerializer(WritableNestedModelSerializer):
# Direct ManyToMany relation
sites
=
SiteSerializer(many
=
True
)
# Reverse FK relation
avatars
=
AvatarSerializer(many
=
True
)
# Direct FK relation
access_key
=
AccessKeySerializer(allow_null
=
True
)
class
Meta:
model
=
Profile
fields
=
(
'pk'
,
'sites'
,
'avatars'
,
'access_key'
,)
class
UserSerializer(WritableNestedModelSerializer):
# Reverse OneToOne relation
profile
=
ProfileSerializer()
class
Meta:
model
=
User
fields
=
(
'pk'
,
'profile'
,
'username'
,)
また、論理の作成または更新のみをサポートする場合は、このパッケージのNestedCreateMixinまたはNestedUpdateMixinを使用します.たとえば、次のネストされたフィールドに関連するデータをプライマリ・シーケンサに渡すことができます.
[Python]純テキスト表示
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
data
=
{
'username'
:
'test'
,
'profile'
: {
'access_key'
: {
'key'
:
'key'
,
},
'sites'
: [
{
'url'
:
'http://google.com'
,
},
{
'url'
:
'http://yahoo.com'
,
},
],
'avatars'
: [
{
'image'
:
'image-1.png'
,
},
{
'image'
:
'image-2.png'
,
},
],
},
}
user_serializer
=
UserSerializer(data
=
data)
user_serializer.is_valid(raise_exception
=
True
)
user
=
user_serializer.save()
このシーケンス化器は、すべてのネストされた関係を自動的に作成し、埋め込まれたデータを含む完全なインスタンスを受信します.
[Python]純テキスト表示
?
1 2
user_serializer
=
UserSerializer(instance
=
user)
print
(user_serializer.data)
[Python]純テキスト表示
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
{
'pk'
:
1
,
'username'
:
'test'
,
'profile'
: {
'pk'
:
1
,
'access_key'
: {
'pk'
:
1
,
'key'
:
'key'
},
'sites'
: [
{
'pk'
:
1
,
'url'
:
'http://google.com'
,
},
{
'pk'
:
2
,
'url'
:
'http://yahoo.com'
,
},
],
'avatars'
: [
{
'pk'
:
1
,
'image'
:
'image-1.png'
,
},
{
'pk'
:
2
,
'image'
:
'image-2.png'
,
},
],
},
}
ベース・シーケンサのsaveメソッドを呼び出すことで、ネストされたシーケンサに値を渡すこともできます.これらのkwargはdictタイプでなければなりません.
[Python]純テキスト表示
?
1 2 3 4 5 6 7
# user_serializer created with 'data' as above
user
=
user_serializer.save(
profile
=
{
'access_key'
: {
'key'
:
'key2'
},
},
)
print
(user.profile.access_key.key)
[Python]純テキスト表示
?
1
'key2'
注:同じ値は、デフォルトなどのすべてのネストされたインスタンスに使用されますが、優先度は高くなります.既知のソリューション問題の更新時に一意のフィールドを持つネストされたシーケンス化器の検証問題この問題を解決できる特別なmixin単一フィールドsmixinがあります.mixinはuniquevalidatorを検証フェーズから保存フェーズに移動します.詳細を知りたい場合は、関連する質問や記事を読むことができます.https://github.com/beda-software/drf-writable-nested/issues/1 http://www.django-rest-framework.org/api-guide/validators/#updating-nested-serializersで使用する例:
[Python]純テキスト表示
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18
class
Child(models.Model):
field
=
models.CharField(unique
=
True
)
class
Parent(models.Model):
child
=
models.ForeignKey(
'Child'
)
class
ChildSerializer(UniqueFieldsMixin, serializers.ModelSerializer):
class
Meta:
model
=
Child
class
ParentSerializer(NestedUpdateMixin, serializers.ModelSerializer):
child
=
ChildSerializer()
class
Meta:
model
=
Parent
注:UniqueFieldsMixinは、一意のフィールドを持つシーケンス化プログラムにのみ適用する必要があります.Mixin ordering Mixin(UniqueFieldsMixinとNestedCreateMixinまたはNestedUpdateMixin)を同時に使用する場合は、UniqueFieldsMixinを前面に配置する必要があります.例:
[Python]純テキスト表示
?
1 2
class
ChildSerializer(UniqueFieldsMixin, NestedUpdateMixin,
serializers.ModelSerializer):
(記事転載元https://www.jianshu.com/p/c057877d26e1)