A serializer mixin for Django REST Framework to expand object representations inline
Install using pip
pip install djangorestframework-expander
expandable_fields
attribute on the serializer Meta class.
MenuItemSerializer
OR(MenuItemSerializer, (), {'many': True})
fields
to appear in expandable_fields
.expand
URL paramter. e.g. /menu-items/?expand=menu
/menu-items/?expand=menu,price_bracket
/menu-items/?expand=menu.restaurant
The available configuration options using settings.py and their defaults.
DRF_EXPANDER_EXPAND_ARG = 'expand'
- The request query param that will be used to indicate which fields to expand.from expander import ExpanderSerializerMixin
class RestaurantSerializer(ExpanderSerializerMixin, serializers.ModelSerializer):
class Meta:
model = Restaurant
fields = ('id', 'title')
class MenuSerializer(ExpanderSerializerMixin, serializers.ModelSerializer):
class Meta:
model = Menu
fields = ('id', 'restaurant', 'title')
expandable_fields = {
'restaurant': RestaurantSerializer,
}
class PriceBracketSerializer(serializers.ModelSerializer):
class Meta:
model = PriceBracket
fields = ('id', 'title')
class MenuItemSerializer(ExpanderSerializerMixin, serializers.ModelSerializer):
class Meta:
model = MenuItem
fields = ('id', 'menu', 'title', 'description', 'price', 'price_bracket')
expandable_fields = {
'menu': MenuSerializer,
'price_bracket': PriceBracketSerializer,
}
Making a request for a menu item returns the usual results to start with.
GET /menu-items/1/
{
"id": 1,
"menu": 3,
"title": "Breakfast",
"description": "",
"price": "3.50"
}
Expand menu
GET /menu-items/1/?expand=menu
{
"id": 1,
"menu": {
"id": 3,
"restaurant": 6,
"title": "Breakfast"
},
"title": "Eggs",
"description": "",
"price": "3.50"
}
Expand nested
GET /menu-items/1/?expand=menu.restaurant
{
"id": 1,
"menu": {
"id": 3,
"restaurant": {
"id": 6,
"title": "Bob's Bed and Breakfast"
},
"title": "Breakfast"
},
"title": "Eggs",
"description": "",
"price": "3.50"
}