두 가지 다른 직렬 변환기를 제공하고 있지만 다음과 같은 모든 기능을 활용할 수 있습니다 ModelViewSet
.
- 객체 목록을 볼 때 각 객체에 세부 정보로 리디렉션되는 URL이
__unicode __
있고 대상 모델을 사용하여 다른 모든 관계가 나타납니다 .
예:
{
"url": "http://127.0.0.1:8000/database/gruppi/2/",
"nome": "universitari",
"descrizione": "unitn!",
"creatore": "emilio",
"accesso": "CHI",
"membri": [
"emilio",
"michele",
"luisa",
"ivan",
"saverio"
]
}
- 객체의 세부 정보를 볼 때 기본값을 사용하고 싶습니다
HyperlinkedModelSerializer
예:
{
"url": "http://127.0.0.1:8000/database/gruppi/2/",
"nome": "universitari",
"descrizione": "unitn!",
"creatore": "http://127.0.0.1:8000/database/utenti/3/",
"accesso": "CHI",
"membri": [
"http://127.0.0.1:8000/database/utenti/3/",
"http://127.0.0.1:8000/database/utenti/4/",
"http://127.0.0.1:8000/database/utenti/5/",
"http://127.0.0.1:8000/database/utenti/6/",
"http://127.0.0.1:8000/database/utenti/7/"
]
}
다음과 같은 방법으로 원하는대로이 모든 작업을 수행 할 수있었습니다.
serializers.py
# serializer to use when showing a list
class ListaGruppi(serializers.HyperlinkedModelSerializer):
membri = serializers.RelatedField(many = True)
creatore = serializers.RelatedField(many = False)
class Meta:
model = models.Gruppi
# serializer to use when showing the details
class DettaglioGruppi(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Gruppi
views.py
class DualSerializerViewSet(viewsets.ModelViewSet):
"""
ViewSet providing different serializers for list and detail views.
Use list_serializer and detail_serializer to provide them
"""
def list(self, *args, **kwargs):
self.serializer_class = self.list_serializer
return viewsets.ModelViewSet.list(self, *args, **kwargs)
def retrieve(self, *args, **kwargs):
self.serializer_class = self.detail_serializer
return viewsets.ModelViewSet.retrieve(self, *args, **kwargs)
class GruppiViewSet(DualSerializerViewSet):
model = models.Gruppi
list_serializer = serializers.ListaGruppi
detail_serializer = serializers.DettaglioGruppi
# etc.
기본적으로 사용자가 목록보기 또는 상세보기를 요청할 때 감지하고 serializer_class
내 요구에 맞게 변경 합니다. 나는이 코드에 실제로 만족하지 않습니다. 더티 해킹처럼 보이며 가장 중요한 것은 두 명의 사용자가 동시에 목록과 세부 정보를 요청하면 어떻게됩니까?
이것을 사용하여 더 좋은 방법이 있습니까? ModelViewSets
아니면 사용 하지 않아야 GenericAPIView
합니까?
편집 :
다음은 사용자 정의 기반을 사용하여 수행하는 방법입니다 ModelViewSet
.
class MultiSerializerViewSet(viewsets.ModelViewSet):
serializers = {
'default': None,
}
def get_serializer_class(self):
return self.serializers.get(self.action,
self.serializers['default'])
class GruppiViewSet(MultiSerializerViewSet):
model = models.Gruppi
serializers = {
'list': serializers.ListaGruppi,
'detail': serializers.DettaglioGruppi,
# etc.
}