wq.db Model Serializer
wq.db’s REST API leverages a custom
ModelSerializer class that provides a number of enhancements to the ModelSerializer provided by Django REST Framework. This custom class is used by default in the default router. If you need to customize the serializer for a specific model, create a subclass of
ModelSerializer and register it with the router:
# myapp/serializers.py from wq.db.rest.serializers import ModelSerializer class MySerializer(ModelSerializer): # custom code ...
# myapp/rest.py from wq.db import rest from .models import MyModel from .serializers import MySerializer rest.router.register_model( MyModel, serializer=MySerializer, fields="__all__", # Unless set on MySerializer.Meta )
wq.db’s ModelSerializer provides a number of enhancements, mostly by overriding and adding to the default fields generated by Django REST Framework’s serializer. Since the primary goal is to facilitate @wq/app integration, the output is a bit more verbose than might be expected for a typical REST API.
In particular, every serialized object is rendered with a
label property that corresponds to the string representation of the object (i.e. the result of the
__str__ function). In addition, every foreign key will be rendered with both an identifier (e.g.
parent_id) and a string representation (e.g.
parent_label.). These properties are quite useful for rendering detailed list views without needing additional lookups to resolve foreign keys, but it can result in more database lookups by the server when the data is initially loaded. If performance is an issue, try overriding the
queryset and using prefetch_related() or select_related() to join across foreign key relationships.
Other enhancements provided by wq.db’s ModelSerializer include:
- GeoJSON support for geometry fields (used in conjunction with wq.db’s
- Support for custom “id” fields
- User-friendly datetime rendering (
- Automatic “nested” serializers for foreign keys when rendering detail views.