JSON Serializing an Inherited Django Model

I have the following Django models

class ConfigurationItem(models.Model): path = models.CharField('Path', max_length=1024) name = models.CharField('Name', max_length=1024, blank=True) description = models.CharField('Description', max_length=1024, blank=True) active = models.BooleanField('Active', default=True) is_leaf = models.BooleanField('Is a Leaf item', default=True) class Location(ConfigurationItem): address = models.CharField(max_length=1024, blank=True) phoneNumber = models.CharField(max_length=255, blank=True) url = models.URLField(blank=True) read_acl = models.ManyToManyField(Group, default=None) write_acl = models.ManyToManyField(Group, default=None) alert_group= models.EmailField(blank=True) 

The full model file is here if this helps.

You can see that the company is a child of the ConfigurationItem class.

I am trying to use JSON serialization using either django.core.serializers.serializer or WadofStuff serializer.

Both serializers are asking me the same problem ...

 >>> from cmdb.models import * >>> from django.core import serializers >>> serializers.serialize('json', [ ConfigurationItem.objects.get(id=7)]) '[{"pk": 7, "model": "cmdb.configurationitem", "fields": {"is_leaf": true, "extension_attribute_10": "", "name": "", "date_modified": "2010-05-19 14:42:53", "extension_attribute_11": false, "extension_attribute_5": "", "extension_attribute_2": "", "extension_attribute_3": "", "extension_attribute_1": "", "extension_attribute_6": "", "extension_attribute_7": "", "extension_attribute_4": "", "date_created": "2010-05-19 14:42:53", "active": true, "path": "/Locations/London", "extension_attribute_8": "", "extension_attribute_9": "", "description": ""}}]' >>> serializers.serialize('json', [ Location.objects.get(id=7)]) '[{"pk": 7, "model": "cmdb.location", "fields": {"write_acl": [], "url": "", "phoneNumber": "", "address": "", "read_acl": [], "alert_group": ""}}]' >>> 

The problem is that serializing a company model gives me fields directly related to this model, and not fields from its parent.

Is there a way to change this behavior, or should I look for building a dictionary of objects and using simplejson to format the output?

Thanks in advance

~ sm

+4
source share
2 answers

This is one of those cases where the answer may come too late for the original poster, but may come in handy for the next Googler.

If you need much more advanced serialization, I cannot help you, but if you want only graceful processing of inheritance based on several tables, then the place to search is in django/core/serializers/base.py in the Serializer base class.

The serialize method has a line:

for field in concrete_model._meta.local_fields:

Monkeypatching or overriding this class and replacing this line:

for field in concrete_model._meta.fields:

There are a few caveats to be aware of, see fixing 12716794db in the Django Git repository and these two problems:

https://code.djangoproject.com/ticket/7350

https://code.djangoproject.com/ticket/7202

In short, you probably should be careful in doing this globally, although overriding this behavior may be fine depending on your purpose.

+4
source

You will need a special serializer to support inherited fields, since the Django serializer will only serialize local fields.

I ended up writing my own when I deal with this issue, feel free to copy it: https://github.com/zmathew/django-backbone/blob/master/backbone/serializers.py

https://github.com/zmathew/django-backbone/blob/351fc75797bc3c75d2aa5c582089eb39ebb6f19a/backbone/serializers.py

To use it yourself, you need to do:

 serializer = AllFieldsSerializer() serializer.serialize(queryset, fields=fields) print serializer.getvalue() 
+2
source

Source: https://habr.com/ru/post/1310243/


All Articles