Django REST 프레임워크 네스트된 관계에 대한 데이터 저장(Writable nested serializers)
6339 단어 WEB
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)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
apr_socket_recv: peer 오류 로 연결 재 설정처음에는 apache 서버 설정 에 문제 가 있다 고 생각 했 습 니 다. 인터넷 에서 찾 아 보 니 당신 도 알 고 있 었 습 니 다. 우리 나라 의 특수 한 국정 관례 에 따라 모두 같은 글 을 시험 해 보 았 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.