sourcetip

django-rest-display 3.0은 네스트된 시리얼라이저로 작성 또는 갱신합니다.

fileupload 2023. 4. 3. 21:41
반응형

django-rest-display 3.0은 네스트된 시리얼라이저로 작성 또는 갱신합니다.

django-rest-framework 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을 입니까?page의 기간 book새 페이지를 만들거나 페이지가 있는 경우 업데이트합니다.

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


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

를 「」로 하면,instance의 것을 만, 재만만 、 만만만만만만만 、 the the the the the the the the the the the the the the the the the the the will will will will 、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()★★★★★★ 。

대량 생성/삭제 등 쿼리 수를 줄일 수 있는 방법은 다양하지만 위의 방법으로 작업을 쉽게 수행할 수 있습니다.

중첩된 데이터를 처리할 때 필요한 동작 유형에는 미묘한 문제가 있으므로 다양한 경우에 예상되는 동작을 정확하게 고려해야 합니다.

저는 ,, 금, 금, 금, 금, 금, 의, 의, 의, also, also, also, also, also, also, also, also, also, also, also, also, also, also,Serializer에서는, ModelSerializer. 이하는 것이 더 . serializer는 다음과 같은 자동 필드 세트에 의존하지 ModelSerializer을 사용하다

drf-writable-nasted를 사용하면 됩니다.그러면 중첩된 시리얼라이저가 자동으로 쓰기 가능하고 업데이트 가능합니다.

네 안에serializers.py:

from drf_writable_nested import WritableNestedModelSerializer

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


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

바로 그거야!

또한 라이브러리는 다음 중 하나만 사용할 수 있습니다.create그리고.update둘 다 필요 없는 경우 로직스(logics)를 사용할 수 있습니다.

언급URL : https://stackoverflow.com/questions/27434593/django-rest-framework-3-0-create-or-update-in-nested-serializer

반응형