Django REST 프레임워크 네스트된 관계에 대한 데이터 저장(Writable nested serializers)

6339 단어 WEB
Django REST 프레임워크를 이용하면 Django의 모델 삽입 관계를 쉽게 전시할 수 있습니다.플러그인 관계의 전시는 서열화 클래스의 depth 속성을 통해 설정하고 depth는 플러그인 관계가 전개되는 층수를 나타낸다.예를 들어, Djiango 자체 User 모델입니다.User는 Groups와 연관되어 있으며, Groups는 Permission과 연관되어 있습니다.시리얼화된 클래스는 다음과 같이 정의됩니다.
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'
        depth = 2

얻은 json 데이터는 2층의 중첩 관계를 전개하고 결과는 다음과 같다.
{
    "id": 1,
    "username": "admin",
     ... ...
    "groups": [
        {
            "id": 1,
            "name": "test111",
            "permissions": [
                {
                    "id": 28,
                    "name": "Can add      ",
                    "codename": "add_customercontact",
                    "content_type": 10
                },
                {
                    "id": 61,
                    "name": "Can add market info",
                    "codename": "add_marketinfo",
                    "content_type": 21
                },
                {
                    "id": 62,
                    "name": "Can change market info",
                    "codename": "change_marketinfo",
                    "content_type": 21
                }
            ]
        }
    ],
    "user_permissions": [
        {
            "id": 1,
            "name": "Can add log entry",
            "codename": "add_logentry",
            "content_type": {
                "id": 1,
                "app_label": "admin",
                "model": "logentry"
            }
        }
        ... ...
    ]
}

이런 모델은 데이터에 대한 끼워넣기 전시가 매우 편리하지만 문제를 가져와 데이터를 저장하고 업데이트할 수 없다.
설명서에 설명되어 있습니다.
To use writable nested serialization you'll want to declare a nested field on the serializer class, and write the create() and/or update() methods explicitly.
문서에 제공된 방법이지만 사용하기 불편합니다.그래서 다음과 같은 방식을 채택했다.두 개의 시리얼화된 클래스를 만듭니다. 하나는 depth이고 하나는 depth가 없습니다.
class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'
        depth = 2

   class UserSerializerNodepth(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'
   ViewSet ,  create  ,  :
  1  def create(self, request):
  2         serialized = UserSerializerNoDepth(data=request.data)
  3         if serialized.is_valid():
  4             serialized.save()
  5             return Response(serialized.data)
  6         else:
  7             return Response(serialized.errors)

관건은 두 번째 줄에 있다. 즉, ViewSet이 원래 지정한 Userializer로 서열화하는 것이 아니라 UserSerializerNoDepth를 이용하여 데이터를 서열화하는 것이다.이렇게 하면 통일된 루트 아래에서 펼쳐진 끼워 넣은 데이터를 볼 수 있고 데이터의 저장도 할 수 있다.업데이트도 마찬가지다.
  1 def update(self, request,pk=None):
  2         user=  self.get_object()
  3         serialized = UserSerializerNoDepth(user,data=request.data)
  4         if serialized.is_valid():
  5             serialized.save()
  6             return Response(serialized.data)
  7         else:
  8             return Response(serialized.errors,status=status.HTTP_400_BAD_REQUEST)

좋은 웹페이지 즐겨찾기