Les choses ont un peu changé depuis 2010, donc la réponse de @ user85461 ne semble plus fonctionner avec Django 1.8 et Python 3.4. Ceci est une réponse mise à jour avec ce qui semble fonctionner pour moi.
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
Utilisation:
>>> ExtJsonSerializer().serialize(MyModel.objects.all(), fields=['myfield', ...], props=['myprop', ...])
Cela nécessiterait la création essentiellement mon propre hachage, pour sérialiser essentiellement un hachage. Si je fais cette route, je peux presque découper toute la sérialisation. J'espérais continuer à utiliser la classe Model django et appeler simplement sérialiser ('json', mon_objet, ...) – ashchristopher
Malheureusement, il semble que les routines de sérialisation de base de Django excluent spécifiquement tout ce qui n'est pas dans '_meta' fondamentalement seulement cherche des champs de modèle de DB. Donc, alors que vous pouvez écrire une fonction qui extrait uniquement les champs de propriété (ce qui peut être mieux fait avec le 'inspecter.La méthode getmembers à la deuxième fade), même en utilisant le paramètre 'fields' de la méthode' serializers.serialize' ne fonctionnerait pas. Voir ici, où ils parcourent le jeu de requête et ne recherchent que du contenu dans '_meta': http://code.djangoproject.com/browser/django/trunk/django/core/serializers/base.py# L39 –