serialization - Django rest framework, use different serializers in the same ModelViewSet -
i provide 2 different serializers , yet able benefit facilities of modelviewset
:
- when viewing list of objects, each object have url redirects details , every other relation appear using
_ _ unicode _ _
of target model; example:[ { "membri": [ "emilio", "michele", "luisa", "ivan", "saverio" ], "creatore": "emilio", "url": "http://127.0.0.1:8000/database/gruppi/2/", "nome": "universitari", "descrizione": "unitn!", "accesso": "chi" } ]
- when viewing details of object, use default
hyperlinkedmodelserializer
, example:{ "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/" ] }
i managed make work wish in following way:
serializers.py
# serializer use when showing list class listagruppi(serializers.hyperlinkedmodelserializer): membri = serializers.relatedfield(many = true) creatore = serializers.relatedfield(many = false) class meta: model = models.gruppi # serializer use when showing details class dettagliogruppi(serializers.hyperlinkedmodelserializer): class meta: model = models.gruppi
views.py
class dualserializerviewset(viewsets.modelviewset): """ viewset providing different serializers list , detail views. use list_serializer , detail_serializer 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.
basically detect when user requesting list view or detailed view , change serializer_class
suit needs. not satisfied code though, looks dirty hack and, importantly, what if 2 users request list , detail @ same moment?
is there better way achieve using modelviewsets
or have fall using genericapiview
?
edit:
here's how using custom base 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. }
override get_serializer_class
method. method used in model mixins retrieve proper serializer class.
note there get_serializer
method returns instance of correct serializer
class dualserializerviewset(viewsets.modelviewset): def get_serializer_class(self): if self.action == 'list': return serializers.listagruppi if self.action == 'retrieve': return serializers.dettagliogruppi return serializers.default # dont' know want create/destroy/update.
Comments
Post a Comment