Serialización JSON de un modelo heredado de Django

Tengo los siguientes modelos de Django.

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) 

El archivo del modelo completo está aquí si ayuda.

Puede ver que la Compañía es una clase secundaria de ConfigurationItem.

Estoy intentando usar la serialización JSON usando el django.core.serializers.serializer o el serializador WadofStuff.

Ambos serializadores me dan el mismo problema …

     >>> 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": ""}}]' >>> 

    El problema es que la serialización del modelo de empresa solo me da los campos directamente asociados con ese modelo, no los campos de su objeto principal.

    ¿Hay alguna forma de alterar este comportamiento o debería estar pensando en crear un diccionario de objetos y usar simplejson para formatear la salida?

    Gracias por adelantado

    ~ sm

    Este es uno de esos momentos en los que la respuesta puede llegar demasiado tarde para el póster original, pero puede ser útil para el próximo Googler.

    Si necesita una serialización mucho más avanzada, no puedo ayudarlo, pero si solo desea un manejo elegante de la herencia de múltiples tablas, el lugar que debe buscar es django/core/serializers/base.py en la clase base de Serializer .

    En el método de serialize hay una línea:

    for field in concrete_model._meta.local_fields:

    Monkeypatching o anular esa clase y reemplazar esa línea con:

    for field in concrete_model._meta.fields:

    Hay algunas advertencias a tener en cuenta, sin embargo, vea cometer 12716794db en el repository de Django Git y estos dos problemas:

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

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

    En pocas palabras, probablemente deberías tener cuidado al hacer esto a nivel mundial, aunque anular ese comportamiento puede estar bien dependiendo de tu objective.

    Necesitará un serializador personalizado para admitir los campos heredados, ya que el serializador de Django solo serializará los campos locales.

    Terminé escribiendo el mío al tratar este problema, siéntase libre de copiarlo: https://github.com/zmathew/django-backbone/blob/master/backbone/serializers.py

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

    Para usarlo por su cuenta, necesita hacer:

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

    Tal vez sea muy tarde, pero doy mi solución, en caso de que pueda ser útil. Usé otra biblioteca Django que hace el truco:

     from django.forms.models import model_to_dict model_to_dict(Location.objects.get(id=7), fields = ['name', 'address', 'phoneNumber']) model_to_dict(Location.objects.get(id=7)) 

    Puede especificar o no la lista de campos. He intentado con un modelo mío, y funcionó bien para mí. La única diferencia es que en la salida solo obtendrá el valor archivado, no la información del modelo.