serialization - Django Rest Framework Serializer format -


i have 2 serializers: 1 restaurant model, mainmenu model:

class restaurantserializer(serializers.modelserializer):     class meta:         model = restaurant   class mainmenuserializer(serializers.modelserializer):      restaurant = restaurantserializer()      main_menu_items = serializers.stringrelatedfield(many=true)      class meta:         model = menumain         fields = ('id', 'restaurant', 'main_menu_items') 

the current output of mainmenuserializer is

[     {         "id": 1,         "restaurant": {             "id": 1,             "name": "restaurant a",             "location": "street b"         },         "main_menu_items": [             "fried rice"         ]     },     {         "id": 2,         "restaurant": {             "id": 1,             "name": "restaurant a",             "location": "street b",         },         "main_menu_items": [             "noodles"         ]     } ] 

but want restaurantserializer output once, this:

[     {         "restaurant": {             "id": 1,             "name": "restaurant a",             "location": "street b"         }     },     [         {             "id": 1,             "main_menu_items": [                 "fried rice",                 "meat balls"             ]         },         {             "id": 2,             "main_menu_items": [                 "noodles"             ]         }     ] ] 

edit: models used

class restaurant(models.model):     name = models.charfield(max_length=100, default='')     location  = models.charfield(max_length=100, default='')  class menumain(models.model):     price = models.integerfield()     restaurant = models.foreignkey(restaurant, related_name='main_menus')  class menumainitems(models.model):     menu_main = models.foreignkey(menumain, related_name='main_menu_items')     item = models.charfield(max_length=150, default='') 

the more "django rest" way of doing set url node each restaurant returns menu items in restaurant. instance,

urls.py

url(r'restaurant-menu/(?p<pk>[0-9]+)$', menuitemviewset.as_view()) 

in viewset class

class menuitemviewset(viewsets.modelviewset):     serializer_class = mainmenuserializer      def retrieve(self, request, pk=none):         return restaurant.objects.get(pk=pk).menumain_set.all()[0].menumainitems_set.all() 

this of course assumes 1 menu per restaurant. if there multiple menus , want of them, it's best practice break 2 calls: 1 restaurant's menu, , particular menu's items. otherwise many assumptions being made organization of data, , that's rather fragile design pattern.

link docs on fetching related objects

if still intent on getting response asked for, need reverse serializer nesting, i.e. add menu field restaurantserializer.


Comments