জ্যাঙ্গোতে আপনি কোনও মডেল উদাহরণটি কীভাবে সিরিয়াল করবেন?


157

কোনও মডেল ক্যোয়ারীসেটকে কীভাবে সিরিয়াল করা যায় সে সম্পর্কে অনেকগুলি ডকুমেন্টেশন রয়েছে তবে আপনি কীভাবে কোনও মডেল ইনস্ট্যান্সের ক্ষেত্রগুলি JSON এ সিরিয়াল করবেন?


দেখে মনে হচ্ছে আপনি 1 অবজেক্টের ক্যোরিসেটটি সিরিয়াল করতে পারবেন, এটি করার জন্য আপনি ক্লাস ব্যবহার করতে পারবেন না django.core। ক্যুরিসেটটি সিরিয়াল ব্যবহার না করার কোনও বিশেষ কারণ?
জ্যাক এম।

1
ক্যোরিসেট সিরিয়ালাইজার ফলাফলটিকে তার চেয়ে আরও দুটি স্তরগুলিতে গুটিয়ে দেয়। সুতরাং আপনাকে ডেটা.নেমের পরিবর্তে ডেটা [0] .ফিল্ডসনাম করতে হবে।
জেসন ক্রিস্টা

আমি যা ভেবেছিলাম. আমি যখন জাঙ্গো ব্যাকএন্ডের জন্য জিডাব্লুটি ইন্টারফেস লিখছিলাম তখন আমি সেই একই সমস্যার মধ্যে পড়েছিলাম। দেখে মনে হচ্ছে ডেভিড হয়ত কোনও কিছুর মধ্যে পড়েছে।
জ্যাক এম।

উত্তর:


241

প্রয়োজনীয় অবজেক্টটি মোড়ানোর জন্য আপনি সহজেই একটি তালিকা ব্যবহার করতে পারেন এবং এটি সঠিকভাবে সিরিয়ালাইজ করার জন্য জ্যাঙ্গো সিরিয়ালাইজসগুলির যা দরকার তা হল:

from django.core import serializers

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

9
তবে প্রতিক্রিয়া হিসাবে আপনাকে সিরিয়ালযুক্ত বস্তুটি পেতে JSON অবজেক্টের শূন্য উপাদান সূচক করতে হবে। কিছু খেয়াল করার জন্য।
লুভিক

10
এবং রুট অবজেক্টের সাথে সমস্ত রেফারেন্সড অবজেক্টকে সিরিয়ালাইজ করা সম্পর্কে কীভাবে?
paweloque

1
আপনি কি [0]আপনার শেষ লাইনের শেষে চাইবেন না , যেমন @ পছন্দসুলভ প্রস্তাবিত? এবং আপনার তালিকার আক্ষরিক (পিইপি 8 এর ভালবাসার জন্য) কমা অনুসরণ করার দরকার নেই।
hobs

ডিসরিয়ালাইজের জন্য অতিরিক্ত পদক্ষেপও প্রয়োজন; দেখতে stackoverflow.com/a/29550004/2800876
Zags

4
এটি আমার পক্ষে কাজ করে না। জ্যাঙ্গো অ্যাট্রিবিউটের এয়ারর ছুড়ে ফেলেছে 'টিপল' অবজেক্টটির কোনও '_meta' নেই
adamF

71

আপনি যদি মডেল দৃষ্টান্তগুলির একটি তালিকা ব্যবহার করছেন যা আপনি সবচেয়ে ভাল ব্যবহার করতে পারেন তবে serializers.serialize()এটি আপনার প্রয়োজনটি পুরোপুরি ফিট করে।

যাইহোক, আপনাকে কোনও একক বস্তু সিরিয়াল করার চেষ্টা করার সাথে একটি সমস্যার মুখোমুখি হতে হবে, কোনও বস্তুর নয় list। এইভাবে, বিভিন্ন হ্যাক থেকে মুক্তি পাওয়ার জন্য, কেবল জ্যাঙ্গোর ব্যবহার করুন model_to_dict(যদি আমার ভুল না serializers.serialize()হয় তবে এটির উপরও নির্ভর করে):

from django.forms.models import model_to_dict

# assuming obj is your model instance
dict_obj = model_to_dict( obj )

এটি এখন json.dumpsজসনকে সিরিয়ালায়িত করার জন্য আপনার কেবল একটি সরাসরি কল প্রয়োজন :

import json
serialized = json.dumps(dict_obj)

এটাই! :)


6
এটি ইউআইডি ক্ষেত্রগুলির সাথে ব্যর্থ হয়, অন্যথায় পরিষ্কার হওয়া উচিত
অ্যালভিন

2
datetimeক্ষেত্রের সাথে ব্যর্থ । json.loads(serialize('json', [obj]))[0]সিরিয়ালাইজার থাকাকালীনই এটিকে সমাধান করুনdjango.core.serializers.serialize
লাল জাদা

43

অ্যারে মোড়ক এড়ানোর জন্য, প্রতিক্রিয়া ফিরে আসার আগে এটি সরিয়ে ফেলুন:

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 ব্যবহার করে, যা কাজের জন্য নিখুঁত সরঞ্জামের মতো দেখায়।


9
জ্যাঙ্গোতে যদি কোনও একক মডেলকে সিরিয়ালকরণের সেরা উপায় এটি হয় তবে তা ভয়াবহ কারণ জসনকে ডিসিসায়ালাইজ করার এবং এটির পুনরায় সিরিয়ালাইজ করার দরকার নেই।
হারবার্ট

@ হারবার্ট, সম্ভবত তবে সেখানে আছে। আপনার যদি আরও ভাল উপায় থাকে তবে আমি সব কান। এটিতে খুব কার্যকর ব্যবহার করা উচিত নয় কারণ একক বস্তুর এনকোডিং করা / ডি / পুনরায় এনকোডিং করা উচিত সেই সংস্থান-নিবিড় হওয়া উচিত নয়। আপনি যদি হররটি আড়াল করতে চান তবে এটিকে কোনও নতুন পদ্ধতি হিসাবে এটিকে একটি সহায়ক ফাংশনে পরিণত করুন বা আপনার অবজেক্টগুলির সাথে প্রসারিত / মিশ্র-ইন করুন।
জুলিয়ান

1
হরর আড়াল করা সমস্যা নয় এবং সম্ভবত এই সমাধানও নয়; আমাকে অবাক করে দেওয়ার বিষয়টি হ'ল এটি জ্যাঙ্গোর এটি করার সর্বোত্তম উপায়।
হারবার্ট

14

এর জন্য একটি ভাল উত্তর আছে এবং আমি অবাক হয়েছি এটির উল্লেখ নেই। কয়েকটি লাইনের সাহায্যে আপনি তারিখ, মডেল এবং অন্য সব কিছু পরিচালনা করতে পারেন।

এমন একটি কাস্টম এনকোডার তৈরি করুন যা মডেলগুলি পরিচালনা করতে পারে:

from django.forms import model_to_dict
from django.core.serializers.json import DjangoJSONEncoder
from django.db.models import Model

class ExtendedEncoder(DjangoJSONEncoder):

    def default(self, o):

        if isinstance(o, Model):
            return model_to_dict(o)

        return super().default(o)

আপনি json.dump ব্যবহার করার সময় এখন এটি ব্যবহার করুন

json.dumps(data, cls=ExtendedEncoder)

এখন মডেল, তারিখ এবং সব কিছু সিরিয়ালাইজ করা যেতে পারে এবং এটি অ্যারে বা সিরিয়ালাইজড এবং আনসিরিয়ালাইজড হওয়ার দরকার নেই। আপনার যেটি কাস্টম রয়েছে তা কেবল defaultপদ্ধতিতে যুক্ত করা যেতে পারে ।

আপনি এমনকি জ্যাঙ্গোর নেটিভ জসনরেসপোনস এইভাবে ব্যবহার করতে পারেন:

from django.http import JsonResponse

JsonResponse(data, encoder=ExtendedEncoder)
``

3
এই সমাধানটি সহজ এবং মার্জিত। এনকোডারটি উভয় json.dumpsএবং json.dumpপদ্ধতিতে ব্যবহার করা যেতে পারে । এইভাবে আপনার অ্যাপ্লিকেশনটির ওয়ার্কফ্লো পরিবর্তন করার দরকার নেই কারণ আপনি কাস্টম অবজেক্ট ব্যবহার করেন বা জসনতে রূপান্তরিত করার আগে অন্য কোনও পদ্ধতি কল যুক্ত করুন। এনকোডারটিতে কেবল আপনার রূপান্তর কোডটি যুক্ত করুন এবং আপনি যেতে প্রস্তুত।
ক্লাদিউ

11

দেখে মনে হচ্ছে আপনি যা যা জিজ্ঞাসা করছেন তাতে আন্তঃব্যবহারের জন্য জাজানো মডেল উদাহরণের ডেটা স্ট্রাকচারকে সিরিয়ালকরণ করা জড়িত। অন্যান্য পোস্টারগুলি সঠিক: আপনি যদি অজানা অ্যাপ্লিকেশন দিয়ে সিরিয়ালাইজড ফর্মটি ব্যবহার করতে চান যা জ্যাঙ্গোর এপিআইয়ের মাধ্যমে ডেটাবেসকে জিজ্ঞাসা করতে পারে, তবে আপনি একটি অবজেক্টের সাহায্যে ক্যোয়ারেটটি সিরিয়াল করতে চাইবেন। অন্যদিকে, আপনার যা প্রয়োজন সেটি হল ডেটাবেস স্পর্শ না করে বা জ্যাঙ্গো ব্যবহার না করে অন্য কোথাও মডেল উদাহরণটি পুনরায় স্ফীত করার উপায়, তবে আপনার কাজ করার সামান্য কাজ হবে।

আমি যা করি তা এখানে:

প্রথমত, আমি demjsonরূপান্তরটির জন্য ব্যবহার করি । আমি যা পেয়েছিলাম তা এটিই হয়েছিল তবে এটি সেরা নাও হতে পারে। আমার বাস্তবায়ন এর বৈশিষ্ট্যগুলির একটির উপর নির্ভর করে, তবে অন্যান্য রূপান্তরকারীদের সাথে একই ধরণের উপায় থাকা উচিত।

দ্বিতীয়ত, json_equivalentসমস্ত মডেলগুলিতে এমন একটি পদ্ধতি প্রয়োগ করুন যা আপনার সিরিয়ালযুক্ত হতে পারে। এটি এর জন্য একটি যাদু পদ্ধতি demjson, তবে এটি সম্ভবত এমন কিছু যা আপনি যা প্রয়োগ করেন তা বিবেচনা না করেই আপনি ভাবতে চাইছেন। ধারণাটি হ'ল আপনি এমন কোনও বস্তু ফিরিয়ে দেন যা সরাসরি রূপান্তরযোগ্য json(যেমন একটি অ্যারে বা অভিধান)। আপনি যদি সত্যিই এটি করতে চান তবে:

def json_equivalent(self):
    dictionary = {}
    for field in self._meta.get_all_field_names()
        dictionary[field] = self.__getattribute__(field)
    return dictionary

আপনার কাছে পুরোপুরি ফ্ল্যাট ডেটা স্ট্রাকচার (না ForeignKeys, ডাটাবেসে কেবল সংখ্যা এবং স্ট্রিং ইত্যাদি) না থাকলে এটি আপনার পক্ষে সহায়ক হবে না । অন্যথায়, আপনার এই পদ্ধতিটি কার্যকর করার সঠিক উপায় সম্পর্কে গুরুত্ব সহকারে চিন্তা করা উচিত।

তৃতীয়, কল demjson.JSON.encode(instance)এবং আপনি যা চান তা আছে।


আমি এখনও কোডটি চেষ্টা করে দেখিনি তবে আমি এটিতে কিছু ত্রুটি চিহ্নিত করতে চেয়েছিলাম। এটি উদাহরণস্বরূপ __মেটা.গেট_ল_ফিল্ড_নাম () এবং গেটট্রিবিউট একটি ফাংশন তাই () হওয়া উচিত এবং না []।
জেসন ক্রিস্টা

এফকে ছাড়াও, এটি ডেটটাইম ক্ষেত্রগুলির জন্য কাজ করবে না (যদি না ডেমজসন.জেএসএন.কোডে যাদু না থাকে)
স্কাইলার সেভল্যান্ড

8

যদি আপনি কোনও মডেল থেকে কীভাবে একটি একক অবজেক্টকে সিরিয়ালাইজ করতে চান এবং আপনি যদি জানেন যে আপনি কেবল ক্যোয়ারেটে একটি জিনিস পেতে যাচ্ছেন (উদাহরণস্বরূপ, অবজেক্টস.জেট ব্যবহার করে) তবে এরকম কিছু ব্যবহার করুন:

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?"}}

তবে এটি কেবল বাইরেরটি নয়, সমস্ত বর্গাকার বন্ধনীগুলি ছাঁটাই করবে। উত্তম? "o = s [1: -1]"?
জুলিয়ান

5

আমি আমার মডেলটিতে সিরিয়ালাইজেশন পদ্ধতি যুক্ত করে এই সমস্যাটি সমাধান করেছি:

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 মডেল ক্ষেত্রগুলির একটি আদেশযুক্ত তালিকা যা দৃষ্টান্তগুলি থেকে এবং মডেল থেকে নিজেই অ্যাক্সেস করা যায়।


3
যদিও ধারণাটি প্রথমে ভাল মনে হতে পারে তবে একটি উল্লেখ করা উচিত যে এই পদ্ধতির ব্যবহারের ফলাফল রয়েছে। আপনি আপনার মডেলটিতে একটি নির্দিষ্ট সিরিয়ালাইজেশন আউটপুট বেঁধে রাখছেন।
জোনাস গিরিগ্যাট

@ জোনাস জিয়ারগ্যাট যেহেতু এই পদ্ধতিটি মডেল থেকে মডেল ভিত্তিতে সংজ্ঞায়িত করা হয়েছে, পদ্ধতির সাথে কী দোষ আছে? দুঃখজনকভাবে মনে হচ্ছে এটি কোনও জাসন বস্তুটিকে ফেরত দেওয়ার একমাত্র উপায় যা ক্ষেত্র এবং উদাহরণের প্রাথমিক কী উভয়ই রাখে।
দোপাট্রামন

5

এটির জন্য আমার সমাধান এখানে, যা আপনাকে সহজেই 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)

পাইথন 3-তে, এটি হয়ে যায়car.json()
টি.কাউটলাকিস

4

ব্যবহার তালিকা, এটি সমস্যার সমাধান করবে

ধাপ 1:

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

ধাপ ২:

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

ধাপ 3:

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

এটি দেখে মনে হচ্ছে এটি এখনও কোনও জসন অ্যারে (অবজেক্টের) হিসাবে নগ্ন বস্তু নয়, যা ওপি সম্পর্কে জিজ্ঞাসা করেছিল as ii, এটি নিয়মিত সিরিয়ালাইজ পদ্ধতির চেয়ে আলাদা নয়।
জুলিয়ান

1
এটি একটি JSON সিরিয়ালাইজেশন ত্রুটির সাথে ব্যর্থ হবে। ক্যোরিসেট অবজেক্টগুলি সিরিয়ালযোগ্য নয়
ডোপাত্রম্যান man

4

সিরিয়ালাইজ করতে এবং ডিসেরায়াল করতে, নিম্নলিখিতটি ব্যবহার করুন:

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 = next(serializers.deserialize("json", serial)).object

আমি পাচ্ছি 'জেনারেটরের অবজেক্টের কোনও বৈশিষ্ট্য নেই' পরবর্তী next কোন ধারণা?
ব্যবহারকারী 2880391

1
@ ব্যবহারকারী 2880391 আমি পাইথন 3 এর জন্য এটি আপডেট করেছি that এটি কি এটি ঠিক করে?
জাগস

4

.values() জেএসএনে একটি মডেল উদাহরণ রূপান্তর করার জন্য আমার যা প্রয়োজন।

। মানসমূহ () ডকুমেন্টেশন: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values

প্রকল্প নামে পরিচিত একটি মডেল সহ ব্যবহারের উদাহরণ ।

দ্রষ্টব্য: আমি জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্ক ব্যবহার করছি

    @csrf_exempt
    @api_view(["GET"])
    def get_project(request):
        id = request.query_params['id']
        data = Project.objects.filter(id=id).values()
        if len(data) == 0:
            return JsonResponse(status=404, data={'message': 'Project with id {} not found.'.format(id)})
        return JsonResponse(data[0])

একটি বৈধ আইডি থেকে ফলাফল:

{
    "id": 47,
    "title": "Project Name",
    "description": "",
    "created_at": "2020-01-21T18:13:49.693Z",
}

3

আপনি যদি ক্লায়েন্টকে জসন প্রতিক্রিয়া হিসাবে একক মডেল অবজেক্টটি ফিরে আসতে চান তবে আপনি এই সহজ সমাধানটি করতে পারেন:

from django.forms.models import model_to_dict
from django.http import JsonResponse

movie = Movie.objects.get(pk=1)
return JsonResponse(model_to_dict(movie))

2

ফর্ম্যাট সহ জ্যাঙ্গো সিরিয়ালাইজার ব্যবহার করুন python,

from django.core import serializers

qs = SomeModel.objects.all()
serialized_obj = serializers.serialize('python', qs)

jsonএবং pythonবিন্যাস মধ্যে পার্থক্য কি ?

jsonবিন্যাস ফলাফলের ফিরে আসবে যেমন strযেহেতু pythonমধ্যে ফলাফলের ফিরে আসবে পারেন listবাOrderedDict


এটি অত্যন্ত দুর্ভাগ্যজনক
জেপিজি

আমি পেয়েছি OrderedDict, নাdict
ব্যবহারকারী 66081

1

দেখে মনে হচ্ছে না আপনি উদাহরণটি সিরিয়াল করতে পারবেন, আপনাকে একটি জিনিসের ক্যোয়ারীসেটটি সিরিয়াল করতে হবে।

from django.core import serializers
from models import *

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

আমি svnজ্যাঙ্গো মুক্তির হাতছাড়া করেছি, সুতরাং এটি আগের সংস্করণগুলিতে নাও থাকতে পারে।


1
ville = UneVille.objects.get(nom='lihlihlihlih')
....
blablablab
.......

return HttpResponse(simplejson.dumps(ville.__dict__))

আমি আমার উদাহরণের আদেশটি ফিরিয়ে দিই

সুতরাং এটি field 'ফিল্ড 1' এর মতো কিছু ফেরত দেয়: মান, "ফিল্ড 2": মান, ....}


এটি ভেঙে যাবে:TypeError: <django.db.models.base.ModelState object at 0x7f2b3bf62310> is not JSON serializable
জুলিও মেরিন্স

1

এই উপায় সম্পর্কে:

def ins2dic(obj):
    SubDic = obj.__dict__
    del SubDic['id']
    del SubDic['_state']
return SubDic

অথবা আপনি চান না এমন কিছু বাদ দিন।


0

এই উত্তরগুলির সমস্তগুলি হ'ল আমি একটি ফ্রেমওয়ার্কের কাছ থেকে কী প্রত্যাশা করব তার তুলনায় কিছুটা হ্যাকি ছিল, সহজ পদ্ধতিটি, আমি মনে করি অনেকদূর মনে হয় আপনি যদি বাকী ফ্রেমওয়ার্কটি ব্যবহার করছেন:

rep = YourSerializerClass().to_representation(your_instance)
json.dumps(rep)

এটি সরাসরি সিরিয়ালাইজার ব্যবহার করে, আপনি যে ক্ষেত্রগুলিতে এটির সংজ্ঞা দিয়েছেন সেগুলি সম্মান করে, পাশাপাশি কোনও সমিতি ইত্যাদি ing

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.