2010 से चीजें थोड़ी-थोड़ी बदल गई हैं, इसलिए @ user85461 का उत्तर अब Django 1.8 और पायथन 3.4 के साथ काम नहीं कर रहा है। यह मेरे लिए काम करने के लिए एक अद्यतन उत्तर है।
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
उपयोग:
>>> ExtJsonSerializer().serialize(MyModel.objects.all(), fields=['myfield', ...], props=['myprop', ...])
कि अनिवार्य रूप से की आवश्यकता होगी अपने ही हैश बनाने, केवल अनिवार्य रूप से एक हैश को क्रमानुसार करने। अगर मैं उस मार्ग पर जाता हूं, तो मैं लगभग पूरे क्रमबद्धता को काट सकता हूं। मैं डीजेंगो मॉडल क्लास का उपयोग जारी रखने की उम्मीद कर रहा था और बस सीरियलize ('जेसन', my_object, ...) – ashchristopher
दुर्भाग्यवश, ऐसा प्रतीत होता है कि Django के कोर सीरियलाइजेशन दिनचर्या विशेष रूप से '_meta' में नहीं है जो कुछ भी बहिष्कृत करते हैं) मूल रूप से केवल डीबी मॉडल फ़ील्ड के लिए दिखता है। तो जब आप एक ऐसा फ़ंक्शन लिख सकते हैं जो केवल संपत्ति फ़ील्ड खींचता है (जो 'निरीक्षण के साथ बेहतर किया जा सकता है।getmembers 'विधि को दूसरी ब्लश पर),' serializers.serialize' विधि पर 'फ़ील्ड' पैरामीटर का उपयोग करने से भी काम नहीं करेगा। यहां देखें, जहां वे पास की गई क्वेरीसेट पर फिर से सक्रिय होते हैं और केवल '_meta' में सामान ढूंढते हैं: http://code.djangoproject.com/browser/django/trunk/django/core/serializers/base.py# L39 –