python आप Django में मॉडल उदाहरण को क्रमबद्ध कैसे करते हैं?



json django-models (8)

मॉडल क्वेरीसेट को क्रमबद्ध करने के तरीके पर बहुत सारे दस्तावेज हैं लेकिन आप मॉडल इंस्टेंस के फ़ील्ड JSON को केवल क्रमबद्ध कैसे करते हैं?

https://ffff65535.com


Serialize और deserialze करने के लिए, निम्न का उपयोग करें:

from django.core import serializers

serial = serializers.serialize("json", [obj])
...
# .next() pulls the first object out of the generator
# .object retrieves django object the object from the DeserializedObject
obj = serializers.deserialize("json", serial).next().object

आप आवश्यक वस्तु को लपेटने के लिए आसानी से एक सूची का उपयोग कर सकते हैं और यह सब कुछ है जो django serializers को सही ढंग से क्रमबद्ध करने की आवश्यकता है, उदाहरण के लिए .:

from django.core import serializers

# assuming obj is a model instance
serialized_obj = serializers.serialize('json', [ obj, ])

इसके लिए मेरा समाधान यहां है, जो आपको JSON को आसानी से अनुकूलित करने के साथ-साथ संबंधित रिकॉर्ड व्यवस्थित करने की अनुमति देता है

सबसे पहले मॉडल पर एक विधि को लागू करें। मैं json कहता हूं लेकिन आप इसे जो कुछ भी पसंद करते हैं उसे कॉल कर सकते हैं, उदाहरण के लिए:

class Car(Model):
    ...
    def json(self):
        return {
            'manufacturer': self.manufacturer.name,
            'model': self.model,
            'colors': [color.json for color in self.colors.all()],
        }

फिर दृश्य में मैं करता हूं:

data = [car.json for car in Car.objects.all()]
return HttpResponse(json.dumps(data), content_type='application/json; charset=UTF-8', status=status)

ऐसा प्रतीत नहीं होता है कि आप एक उदाहरण को क्रमबद्ध कर सकते हैं, आपको एक ऑब्जेक्ट की क्वेरीरीट को क्रमबद्ध करना होगा।

from django.core import serializers
from models import *

def getUser(request):
    return HttpResponse(json(Users.objects.filter(id=88)))

मैं django के svn रिलीज से बाहर चला गया, तो यह पिछले संस्करणों में नहीं हो सकता है।


मैंने अपने मॉडल में एक सीरियलाइजेशन विधि जोड़कर इस समस्या को हल किया:

def toJSON(self):
    import simplejson
    return simplejson.dumps(dict([(attr, getattr(self, attr)) for attr in [f.name for f in self._meta.fields]]))

यहां एक-लाइनर के विपरीत उन वर्बोज़ समकक्ष हैं:

def toJSON(self):
    fields = []
    for field in self._meta.fields:
        fields.append(field.name)

    d = {}
    for attr in fields:
        d[attr] = getattr(self, attr)

    import simplejson
    return simplejson.dumps(d)

_meta.fields मॉडल फ़ील्ड की ऑर्डर की गई सूची है जिसे उदाहरणों और मॉडल से ही एक्सेस किया जा सकता है।


यदि आप एक मॉडल से एक ऑब्जेक्ट को क्रमबद्ध करने के लिए कह रहे हैं और आप जानते हैं कि आप केवल क्वेरीसेट में एक ऑब्जेक्ट प्राप्त करने जा रहे हैं (उदाहरण के लिए, ऑब्जेक्ट्स.get का उपयोग करके), तो कुछ इस तरह का उपयोग करें:

import django.core.serializers
import django.http
import models

def jsonExample(request,poll_id):
    s = django.core.serializers.serialize('json',[models.Poll.objects.get(id=poll_id)])
    # s is a string with [] around it, so strip them off
    o=s.strip("[]")
    return django.http.HttpResponse(o, mimetype="application/json")

जो आपको फॉर्म का कुछ प्राप्त करेगा:

{"pk": 1, "model": "polls.poll", "fields": {"pub_date": "2013-06-27T02:29:38.284Z", "question": "What's up?"}}

सरणी रैपर से बचने के लिए, प्रतिक्रिया वापस करने से पहले इसे हटा दें:

import json
from django.core import serializers

def getObject(request, id):
    obj = MyModel.objects.get(pk=id)
    data = serializers.serialize('json', [obj,])
    struct = json.loads(data)
    data = json.dumps(struct[0])
    return HttpResponse(data, mimetype='application/json')

मुझे इस विषय पर भी इस दिलचस्प पोस्ट को मिला:

http://timsaylor.com/convert-django-model-instances-to-dictionaries

यह django.forms.models.model_to_dict का उपयोग करता है, जो नौकरी के लिए सही उपकरण की तरह दिखता है।


सूची का प्रयोग करें, यह समस्या हल करेगा

चरण 1:

 result=YOUR_MODELE_NAME.objects.values('PROP1','PROP2').all();

चरण 2:

 result=list(result)  #after getting data from model convert result to list

चरण 3:

 return HttpResponse(json.dumps(result), content_type = "application/json")




serialization