Die Dinge haben sich seit 2010 ein wenig verändert, daher scheint die Antwort von @ user85461 nicht mehr mit Django 1.8 und Python 3.4 zu funktionieren. Dies ist eine aktualisierte Antwort mit dem, was für mich zu funktionieren scheint.
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
Verbrauch:
>>> ExtJsonSerializer().serialize(MyModel.objects.all(), fields=['myfield', ...], props=['myprop', ...])
, dass meine eigene Hash im Wesentlichen zu schaffen, nur erfordern würde im Wesentlichen ein Hash-Serialisierung zu. Wenn ich diesen Weg gehe, kann ich fast die gesamte Serialisierung ausschneiden. Ich hoffte, weiterhin die Django Model-Klasse zu verwenden und rufen Sie einfach serialize ('json', my_object, ...) – ashchristopher
Leider scheint es, dass Django Kern Serialisierungsroutinen ausdrücklich alles ausschließen, die nicht in '_meta' ist sucht grundsätzlich nur nach db-Modellfeldern. So, während Sie eine Funktion schreiben können, die nur Eigenschaftsfelder herauszieht (was besser mit dem 'inspect.getmembers 'Methode bei Second Blush), selbst mit dem' fields' Parameter der 'serializers.serialize' Methode würde nicht funktionieren. Sehen Sie hier, wo sie über das übergebene Queryset iterieren und nur nach Dingen in '_meta' suchen: http://code.djangoproject.com/browser/django/trunk/django/core/serializers/base.py# L39 –