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 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)