Las cosas han cambiado un poco desde 2010, por lo que la respuesta de @ user85461 parece que ya no funciona con Django 1.8 y Python 3.4. Esta es una respuesta actualizada con lo que parece funcionar para mí.
from django.core.serializers.base import Serializer as BaseSerializer
from django.core.serializers.python import Serializer as PythonSerializer
from django.core.serializers.json import Serializer as JsonSerializer
from django.utils import six
class ExtBaseSerializer(BaseSerializer):
""" Abstract serializer class; everything is the same as Django's base except from the marked lines """
def serialize(self, queryset, **options):
self.options = options
self.stream = options.pop('stream', six.StringIO())
self.selected_fields = options.pop('fields', None)
self.selected_props = options.pop('props', None) # added this
self.use_natural_keys = options.pop('use_natural_keys', False)
self.use_natural_foreign_keys = options.pop('use_natural_foreign_keys', False)
self.use_natural_primary_keys = options.pop('use_natural_primary_keys', False)
self.start_serialization()
self.first = True
for obj in queryset:
self.start_object(obj)
concrete_model = obj._meta.concrete_model
for field in concrete_model._meta.local_fields:
if field.serialize:
if field.rel is None:
if self.selected_fields is None or field.attname in self.selected_fields:
self.handle_field(obj, field)
else:
if self.selected_fields is None or field.attname[:-3] in self.selected_fields:
self.handle_fk_field(obj, field)
for field in concrete_model._meta.many_to_many:
if field.serialize:
if self.selected_fields is None or field.attname in self.selected_fields:
self.handle_m2m_field(obj, field)
# added this loop
if self.selected_props:
for field in self.selected_props:
self.handle_prop(obj, field)
self.end_object(obj)
if self.first:
self.first = False
self.end_serialization()
return self.getvalue()
# added this function
def handle_prop(self, obj, field):
self._current[field] = getattr(obj, field)
class ExtPythonSerializer(ExtBaseSerializer, PythonSerializer):
pass
class ExtJsonSerializer(ExtPythonSerializer, JsonSerializer):
pass
Uso:
>>> ExtJsonSerializer().serialize(MyModel.objects.all(), fields=['myfield', ...], props=['myprop', ...])
que requeriría esencialmente la creación de mi propia hachís, sólo para serializar esencialmente a un hash. Si voy por esa ruta, casi puedo cortar toda la serialización. Tenía la esperanza de seguir utilizando la clase de modelo django y simplemente llamar serialize ('json', my_object, ...) – ashchristopher
Desafortunadamente, parece que las rutinas de serialización de núcleo de Django excluyen específicamente todo lo que no está en '_meta' que Básicamente solo busca los campos del modelo db. Así que mientras puede escribir una función que solo saca campos de propiedad (lo cual se puede hacer mejor con 'inspeccionar.método getmembers' en segundo rubor), incluso el uso del parámetro 'fields' en el método' serializers.serialize' no funcionaría. Vea aquí, donde iteran sobre el queryset pasado y solo buscan cosas en '_meta': http://code.djangoproject.com/browser/django/trunk/django/core/serializers/base.py# L39 –