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

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -