excludes
and extras
options to the Wad of Stuff serializer. In this article I introduce the relations
option.Relations
The Wad of Stuff serializers allow you to follow and serialize related fields of a model to any depth you wish. This is why it is considered a "full serializer" as opposed to Django's built-in serializers that only return the related fields primary key value.
When using the relations argument to the serializer you may specify either a list of fields to be serialized or a dictionary of key/value pairs. The dictionary keys are the field names of the related fields to be serialized and the values are the arguments to pass to the serializer when processing that related field.
This first example shows the simplest way of serializing a related field. The Group model has a ManyToManyField to the Permission model. In this case there is only one permission but if there were more then each would be serialized.
>>> print serializers.serialize('json', Group.objects.all(), indent=4, relations=('permissions',))
[
{
"pk": 2,
"model": "auth.group",
"fields": {
"name": "session",
"permissions": [
{
"pk": 19,
"model": "auth.permission",
"fields": {
"codename": "add_session",
"name": "Can add session",
"content_type": 7
}
}
]
}
}
]
relations
option. This dictionary is a series of nested dictionaries that are unrolled and passed as arguments when serializing each related field.>>> print serializers.serialize('json', Group.objects.all(), indent=4, relations={'permissions':{'fields':('codename',)}})
[
{
"pk": 2,
"model": "auth.group",
"fields": {
"name": "session",
"permissions": [
{
"pk": 19,
"model": "auth.permission",
"fields": {
"codename": "add_session"
}
}
]
}
}
]
serialize('json', permissions_queryset, fields=('codename',))
when the permissions field is serialized.Serializing deeper relations
The power of the
relations
option becomes obvious when you see it in action serializing related fields that are 2 or more levels deep. Below the content_type ForeignKey field on the Permission model is also serialized.>>> print serializers.serialize('json', Group.objects.all(), indent=4, relations={'permissions':{'relations':('content_type',)}})
[
{
"pk": 2,
"model": "auth.group",
"fields": {
"name": "session",
"permissions": [
{
"pk": 19,
"model": "auth.permission",
"fields": {
"codename": "add_session",
"name": "Can add session",
"content_type": {
"pk": 7,
"model": "contenttypes.contenttype",
"fields": {
"model": "session",
"name": "session",
"app_label": "sessions"
}
}
}
}
]
}
}
]
Combining options
You may also combine the other options when serializing related fields. In the example below I am excluding the
content_type.app_label
field from being serialized.>>> print serializers.serialize('json', Group.objects.all(), indent=4, relations={'permissions':{'relations':{'content_type':{'excludes':('app_label',)}}}})
[
{
"pk": 2,
"model": "auth.group",
"fields": {
"name": "session",
"permissions": [
{
"pk": 19,
"model": "auth.permission",
"fields": {
"codename": "add_session",
"name": "Can add session",
"content_type": {
"pk": 7,
"model": "contenttypes.contenttype",
"fields": {
"model": "session",
"name": "session"
}
}
}
}
]
}
}
]
5 comments:
This is wonderful stuff.
I'm a bit stuck with reverse look-up relations, where you might call model.othermodel_set. How might I achieve serialisation of those?
Thanks.
I don't think it can be done with my serializer as it is now. If you'd like to see it do this then please open a ticket at http://code.google.com/p/wadofstuff/issues/list and I'll see what I can do.
Thanks - good suggestion. Let me see if I can put together a coherent proposal first!
Hi Matthew,
I've raised a ticket and submitted a patch on the Google code page to address reverse PK and M2M serialisation. See what you think!
Bests wishes...
Hi, mathew. what if i know only depth of seriliztion i want and not the feild names? That means i will give a max depth of 2 if i want to drill down upto 2 foreign key levels.And i dont know the filed names.
Post a Comment