ネストされたシリアライザでのdjango-rest-framework 3.0の作成または更新

ノーベルト:

ジャンゴ休止フレームワーク3.0およびこれらの単純なモデルを持ちます:

class Book(models.Model):
    title = models.CharField(max_length=50)


class Page(models.Model):
    book = models.ForeignKey(Books, related_name='related_book')
    text = models.CharField(max_length=500)

そして、このJSONリクエストを与えられます:

{
   "book_id":1,
   "pages":[
      {
         "page_id":2,
         "text":"loremipsum"
      },
      {
         "page_id":4,
         "text":"loremipsum"
      }
   ]
}

ネストされたシリアライザを記述してこのJSONを処理し、指定されたJSONごとpagebook新しいページを作成するか、存在する場合は更新する方法を教えてください。

class RequestSerializer(serializers.Serializer):
    book_id = serializers.IntegerField()
    page = PageSerializer(many=True)


class PageSerializer(serializers.ModelSerializer):
    class Meta:
        model = Page

シリアライザをでインスタンス化するinstanceと現在のシリアライザが更新されることはわかっていますが、createネストされたシリアライザのメソッド内でそれをどのように使用すればよいですか?

トム・クリスティー:

まず、新しいブックインスタンスの作成をサポートしますか、それとも既存のインスタンスの更新のみをサポートしますか?

新しい本のインスタンスを作成したいだけの場合は、次のようなことができます...

class PageSerializer(serializers.Serializer):
    text = serializers.CharField(max_length=500)

class BookSerializer(serializers.Serializer):
    page = PageSerializer(many=True)
    title = serializers.CharField(max_length=50)

    def create(self, validated_data):
        # Create the book instance
        book = Book.objects.create(title=validated_data['title'])

        # Create or update each page instance
        for item in validated_data['pages']:
            page = Page(id=item['page_id'], text=item['text'], book=book)
            page.save()

        return book

ここに含まれていませんbook_id本のインスタンスを作成するときは、本のIDは含めません。書籍のインスタンスを更新する場合、通常はリクエストデータではなく、URLの一部として書籍IDを含めます。

書籍インスタンスの作成と更新の両方をサポートする場合は、リクエストに含まれていないが現在書籍インスタンスに関連付けられているページの処理方法を検討する必要があります。

これらのページを黙って無視してそのままにしておくか、検証エラーを発生させるか、または削除するかを選択できます。

リクエストに含まれていないページを削除したいとします。

def create(self, validated_data):
    # As before.
    ...

def update(self, instance, validated_data):
    # Update the book instance
    instance.title = validated_data['title']
    instance.save()

    # Delete any pages not included in the request
    page_ids = [item['page_id'] for item in validated_data['pages']]
    for page in instance.books:
        if page.id not in page_ids:
            page.delete()

    # Create or update page instances that are in the request
    for item in validated_data['pages']:
        page = Page(id=item['page_id'], text=item['text'], book=instance)
        page.save()

    return instance

また、本の更新のみをサポートし、作成はサポートしないこともできますその場合、メソッドのみを含めますupdate()

クエリの数を減らすことができるさまざまな方法もあります。一括作成/削除を使用しますが、上記はかなり簡単な方法で仕事をします。

ご覧のように、ネストされたデータを処理するときに必要になる可能性のある動作のタイプには微妙な点があるため、さまざまなケースで予想される動作を正確に慎重に検討してください。

Serializer上記の例では、ではなくを使用ていることにも注意してくださいModelSerializerこの場合ModelSerializer、デフォルト生成されるフィールドの自動セットに依存するのではなく、シリアライザクラスにすべてのフィールドを明示的に含めるだけの方が簡単です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Django Rest-Frameworkネストされたシリアライザーの順序

分類Dev

Django Rest Frameworkのネストされたシリアライザーのユニークな検証

分類Dev

ネストされた関係シリアライザのDjango Rest FrameworkモデルIDフィールド

分類Dev

django-rest-frameworkの書き込み可能なネストされたシリアライザー?

分類Dev

Django Rest Frameworkでネストされたシリアライザをどのようにフィルタリングしますか?

分類Dev

Django-Rest-Frameworkを使用したネストされたシリアライザー

分類Dev

Django Rest Framework:ネストされた関係のUUIDのリストをシリアライザーに渡す方法は?

分類Dev

Django Rest Framework書き込み可能なネストされたシリアライザー

分類Dev

Django Rest Framework書き込み可能なネストされたシリアライザー

分類Dev

Django Rest Framework:シリアライザーのビューから渡された引数へのアクセス

分類Dev

Django REST Framework3の追加のシリアライザーフィールド

分類Dev

Django Rest Frameworkのシリアル化された画像は、Amazon s3のURLではなく、絶対的なシステムURLを返します

分類Dev

Django Rest Framework:汎用外部キーを使用した書き込み可能なネストされたシリアライザー

分類Dev

Django Rest Frameworkのシリアライザーを使用してネストされた関係を持つモデルデータを取得するにはどうすればよいですか?

分類Dev

Django Rest Framework:ネストされたシリアライザーにデータを渡し、カスタム検証後にのみオブジェクトを作成する方法

分類Dev

Django Rest FrameworkはPOSTで主キー値を受け取り、ネストされたシリアライザーとしてモデルオブジェクトを返します

分類Dev

Django Rest Framework、ネストされたシリアル化されたデータを更新

分類Dev

RESTの多対多フィールドとネストされたシリアライザー:ネストされたシリアライザーを上書きしても、Djangoでネストされたオブジェクトは作成されません

分類Dev

Django Rest FrameworkPOSTおよびGETネストされたシリアライザー

分類Dev

これは、Django Rest Frameworkシリアライザーの更新メソッドを実行するための問題のない方法ですか?

分類Dev

Django RESTフレームワーク-ネストされたシリアライザーのクエリ制限?

分類Dev

ネストされた関係RESTシリアライザー

分類Dev

Django Rest(ネストされたシリアライザー)でPOSTした後、ForeignKeyがnullになる

分類Dev

DjangoのRESTネストされたシリアライザーが失敗する

分類Dev

Django Rest Framework:rest_framework.FileFieldのカスタム作成されたバリデーターでファイルのサイズにアクセスする方法は?

分類Dev

django-rest-framework:シリアライザーインスタンスのインスタンス化時に `data =`キーワード引数が渡されなかったため、 `.is_valid()`を呼び出すことができません

分類Dev

Django Rest Framework-シリアライザーのcreateメソッドでpkidまたは完全なオブジェクトを許可できますか?

分類Dev

Django Rest Frameworkで(PUTを使用して)作成または更新する

分類Dev

モデル、ビュー、またはシリアライザーは、Django Rest FrameworkのRESTリソースを表していますか?

Related 関連記事

  1. 1

    Django Rest-Frameworkネストされたシリアライザーの順序

  2. 2

    Django Rest Frameworkのネストされたシリアライザーのユニークな検証

  3. 3

    ネストされた関係シリアライザのDjango Rest FrameworkモデルIDフィールド

  4. 4

    django-rest-frameworkの書き込み可能なネストされたシリアライザー?

  5. 5

    Django Rest Frameworkでネストされたシリアライザをどのようにフィルタリングしますか?

  6. 6

    Django-Rest-Frameworkを使用したネストされたシリアライザー

  7. 7

    Django Rest Framework:ネストされた関係のUUIDのリストをシリアライザーに渡す方法は?

  8. 8

    Django Rest Framework書き込み可能なネストされたシリアライザー

  9. 9

    Django Rest Framework書き込み可能なネストされたシリアライザー

  10. 10

    Django Rest Framework:シリアライザーのビューから渡された引数へのアクセス

  11. 11

    Django REST Framework3の追加のシリアライザーフィールド

  12. 12

    Django Rest Frameworkのシリアル化された画像は、Amazon s3のURLではなく、絶対的なシステムURLを返します

  13. 13

    Django Rest Framework:汎用外部キーを使用した書き込み可能なネストされたシリアライザー

  14. 14

    Django Rest Frameworkのシリアライザーを使用してネストされた関係を持つモデルデータを取得するにはどうすればよいですか?

  15. 15

    Django Rest Framework:ネストされたシリアライザーにデータを渡し、カスタム検証後にのみオブジェクトを作成する方法

  16. 16

    Django Rest FrameworkはPOSTで主キー値を受け取り、ネストされたシリアライザーとしてモデルオブジェクトを返します

  17. 17

    Django Rest Framework、ネストされたシリアル化されたデータを更新

  18. 18

    RESTの多対多フィールドとネストされたシリアライザー:ネストされたシリアライザーを上書きしても、Djangoでネストされたオブジェクトは作成されません

  19. 19

    Django Rest FrameworkPOSTおよびGETネストされたシリアライザー

  20. 20

    これは、Django Rest Frameworkシリアライザーの更新メソッドを実行するための問題のない方法ですか?

  21. 21

    Django RESTフレームワーク-ネストされたシリアライザーのクエリ制限?

  22. 22

    ネストされた関係RESTシリアライザー

  23. 23

    Django Rest(ネストされたシリアライザー)でPOSTした後、ForeignKeyがnullになる

  24. 24

    DjangoのRESTネストされたシリアライザーが失敗する

  25. 25

    Django Rest Framework:rest_framework.FileFieldのカスタム作成されたバリデーターでファイルのサイズにアクセスする方法は?

  26. 26

    django-rest-framework:シリアライザーインスタンスのインスタンス化時に `data =`キーワード引数が渡されなかったため、 `.is_valid()`を呼び出すことができません

  27. 27

    Django Rest Framework-シリアライザーのcreateメソッドでpkidまたは完全なオブジェクトを許可できますか?

  28. 28

    Django Rest Frameworkで(PUTを使用して)作成または更新する

  29. 29

    モデル、ビュー、またはシリアライザーは、Django Rest FrameworkのRESTリソースを表していますか?

ホットタグ

アーカイブ