Serializing content¶
Guillotina provides ways to hook into the content serialization that is done when you retreive content from the API.
All serializers are:
- adapters of the context and current request
- async callable objects that return a dictionary of json compatible data
The training doc has a great introduction on customizing the serialization for content.
Serialization interfaces:
guillotina.interfaces.IResourceSerializeToJson
: Provides full contentguillotina.interfaces.IResourceSerializeToJsonSummary
: Summary of contentguillotina.interfaces.IFactorySerializeToJson
: Information on conten typeguillotina.interfaces.ISchemaSerializeToJson
: Serialize full schemaguillotina.interfaces.ISchemaFieldSerializeToJson
: Feild of a schemaguillotina.interfaces.ICatalogDataAdapter
: Searchable data(for adapters like elasticsearch)guillotina.interfaces.ISecurityInfo
: minimal data used for changes to security of object required by catalog adapters.guillotina.db.interfaces.IJSONDBSerializer
: Content serialized to db in addition to pickled data. Used with the JSONB field in postgresql. By default this is the same asICatalogDataAdapter
.
Type serialization¶
You can customize the any serialization by providing override adapters.
For example, to customize the default summary serialization of your custom type:
from guillotina import configure
from guillotina.interfaces import IResourceSerializeToJsonSummary
from guillotina.json.serialize_content import DefaultJSONSummarySerializer
from zope.interface import Interface
@configure.adapter(
for_=(IMyContext, Interface),
provides=IResourceSerializeToJsonSummary)
class ConversationJSONSummarySerializer(DefaultJSONSummarySerializer):
async def __call__(self):
data = await super().__call__()
data.update({
'creation_date': self.context.creation_date,
'title': self.context.title,
'users': self.context.users
})
return data
JSON DB¶
By default, store_json
is false
in the application settings. To activate this
feature, make sure to set store_json: true
in your yaml configuration.
To customize the json serialized to the database for your application or type:
from guillotina.db.interfaces import IJSONDBSerializer
from guillotina import configure
@configure.adapter(
for_=IMyType,
provides=IJSONDBSerializer)
class JSONDBSerializer(DefaultCatalogDataAdapter):
async def __call__(self):
return {
'foo': 'bar'
}