Tôi muốn cung cấp hai bộ nối tiếp khác nhau và vẫn có thể hưởng lợi từ tất cả các phương tiện của ModelViewSet
:
- Khi xem danh sách các đối tượng, tôi muốn mỗi đối tượng có một url chuyển hướng đến các chi tiết của nó và mọi quan hệ khác xuất hiện bằng cách sử dụng
__unicode __
mô hình đích;
thí dụ:
{
"url": "http://127.0.0.1:8000/database/gruppi/2/",
"nome": "universitari",
"descrizione": "unitn!",
"creatore": "emilio",
"accesso": "CHI",
"membri": [
"emilio",
"michele",
"luisa",
"ivan",
"saverio"
]
}
- Khi xem chi tiết của một đối tượng, tôi muốn sử dụng mặc định
HyperlinkedModelSerializer
thí dụ:
{
"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/"
]
}
Tôi quản lý để làm cho tất cả công việc này như tôi muốn theo cách sau:
nối tiếp
# 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
lượt xem
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.
Về cơ bản tôi phát hiện khi người dùng yêu cầu chế độ xem danh sách hoặc chế độ xem chi tiết và thay đổi serializer_class
cho phù hợp với nhu cầu của tôi. Tôi không thực sự hài lòng với mã này, nó trông giống như một bản hack bẩn và quan trọng nhất là, nếu hai người dùng yêu cầu một danh sách và một chi tiết cùng một lúc thì sao?
Có cách nào tốt hơn để đạt được điều này bằng cách sử dụng ModelViewSets
hay tôi phải quay lại sử dụng GenericAPIView
?
EDIT:
Đây là cách thực hiện bằng cơ sở tùy chỉnh 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.
}