কোনও মডেল ক্যোয়ারীসেটকে কীভাবে সিরিয়াল করা যায় সে সম্পর্কে অনেকগুলি ডকুমেন্টেশন রয়েছে তবে আপনি কীভাবে কোনও মডেল ইনস্ট্যান্সের ক্ষেত্রগুলি JSON এ সিরিয়াল করবেন?
কোনও মডেল ক্যোয়ারীসেটকে কীভাবে সিরিয়াল করা যায় সে সম্পর্কে অনেকগুলি ডকুমেন্টেশন রয়েছে তবে আপনি কীভাবে কোনও মডেল ইনস্ট্যান্সের ক্ষেত্রগুলি JSON এ সিরিয়াল করবেন?
উত্তর:
প্রয়োজনীয় অবজেক্টটি মোড়ানোর জন্য আপনি সহজেই একটি তালিকা ব্যবহার করতে পারেন এবং এটি সঠিকভাবে সিরিয়ালাইজ করার জন্য জ্যাঙ্গো সিরিয়ালাইজসগুলির যা দরকার তা হল:
from django.core import serializers
# assuming obj is a model instance
serialized_obj = serializers.serialize('json', [ obj, ])
[0]
আপনার শেষ লাইনের শেষে চাইবেন না , যেমন @ পছন্দসুলভ প্রস্তাবিত? এবং আপনার তালিকার আক্ষরিক (পিইপি 8 এর ভালবাসার জন্য) কমা অনুসরণ করার দরকার নেই।
আপনি যদি মডেল দৃষ্টান্তগুলির একটি তালিকা ব্যবহার করছেন যা আপনি সবচেয়ে ভাল ব্যবহার করতে পারেন তবে 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)
এটাই! :)
datetime
ক্ষেত্রের সাথে ব্যর্থ । json.loads(serialize('json', [obj]))[0]
সিরিয়ালাইজার থাকাকালীনই এটিকে সমাধান করুনdjango.core.serializers.serialize
অ্যারে মোড়ক এড়ানোর জন্য, প্রতিক্রিয়া ফিরে আসার আগে এটি সরিয়ে ফেলুন:
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 ব্যবহার করে, যা কাজের জন্য নিখুঁত সরঞ্জামের মতো দেখায়।
এর জন্য একটি ভাল উত্তর আছে এবং আমি অবাক হয়েছি এটির উল্লেখ নেই। কয়েকটি লাইনের সাহায্যে আপনি তারিখ, মডেল এবং অন্য সব কিছু পরিচালনা করতে পারেন।
এমন একটি কাস্টম এনকোডার তৈরি করুন যা মডেলগুলি পরিচালনা করতে পারে:
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)
``
json.dumps
এবং json.dump
পদ্ধতিতে ব্যবহার করা যেতে পারে । এইভাবে আপনার অ্যাপ্লিকেশনটির ওয়ার্কফ্লো পরিবর্তন করার দরকার নেই কারণ আপনি কাস্টম অবজেক্ট ব্যবহার করেন বা জসনতে রূপান্তরিত করার আগে অন্য কোনও পদ্ধতি কল যুক্ত করুন। এনকোডারটিতে কেবল আপনার রূপান্তর কোডটি যুক্ত করুন এবং আপনি যেতে প্রস্তুত।
দেখে মনে হচ্ছে আপনি যা যা জিজ্ঞাসা করছেন তাতে আন্তঃব্যবহারের জন্য জাজানো মডেল উদাহরণের ডেটা স্ট্রাকচারকে সিরিয়ালকরণ করা জড়িত। অন্যান্য পোস্টারগুলি সঠিক: আপনি যদি অজানা অ্যাপ্লিকেশন দিয়ে সিরিয়ালাইজড ফর্মটি ব্যবহার করতে চান যা জ্যাঙ্গোর এপিআইয়ের মাধ্যমে ডেটাবেসকে জিজ্ঞাসা করতে পারে, তবে আপনি একটি অবজেক্টের সাহায্যে ক্যোয়ারেটটি সিরিয়াল করতে চাইবেন। অন্যদিকে, আপনার যা প্রয়োজন সেটি হল ডেটাবেস স্পর্শ না করে বা জ্যাঙ্গো ব্যবহার না করে অন্য কোথাও মডেল উদাহরণটি পুনরায় স্ফীত করার উপায়, তবে আপনার কাজ করার সামান্য কাজ হবে।
আমি যা করি তা এখানে:
প্রথমত, আমি 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)
এবং আপনি যা চান তা আছে।
যদি আপনি কোনও মডেল থেকে কীভাবে একটি একক অবজেক্টকে সিরিয়ালাইজ করতে চান এবং আপনি যদি জানেন যে আপনি কেবল ক্যোয়ারেটে একটি জিনিস পেতে যাচ্ছেন (উদাহরণস্বরূপ, অবজেক্টস.জেট ব্যবহার করে) তবে এরকম কিছু ব্যবহার করুন:
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?"}}
আমি আমার মডেলটিতে সিরিয়ালাইজেশন পদ্ধতি যুক্ত করে এই সমস্যাটি সমাধান করেছি:
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
মডেল ক্ষেত্রগুলির একটি আদেশযুক্ত তালিকা যা দৃষ্টান্তগুলি থেকে এবং মডেল থেকে নিজেই অ্যাক্সেস করা যায়।
এটির জন্য আমার সমাধান এখানে, যা আপনাকে সহজেই 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)
car.json()
ব্যবহার তালিকা, এটি সমস্যার সমাধান করবে
ধাপ 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")
সিরিয়ালাইজ করতে এবং ডিসেরায়াল করতে, নিম্নলিখিতটি ব্যবহার করুন:
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
.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",
}
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
দেখে মনে হচ্ছে না আপনি উদাহরণটি সিরিয়াল করতে পারবেন, আপনাকে একটি জিনিসের ক্যোয়ারীসেটটি সিরিয়াল করতে হবে।
from django.core import serializers
from models import *
def getUser(request):
return HttpResponse(json(Users.objects.filter(id=88)))
আমি svn
জ্যাঙ্গো মুক্তির হাতছাড়া করেছি, সুতরাং এটি আগের সংস্করণগুলিতে নাও থাকতে পারে।
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
এই উত্তরগুলির সমস্তগুলি হ'ল আমি একটি ফ্রেমওয়ার্কের কাছ থেকে কী প্রত্যাশা করব তার তুলনায় কিছুটা হ্যাকি ছিল, সহজ পদ্ধতিটি, আমি মনে করি অনেকদূর মনে হয় আপনি যদি বাকী ফ্রেমওয়ার্কটি ব্যবহার করছেন:
rep = YourSerializerClass().to_representation(your_instance)
json.dumps(rep)
এটি সরাসরি সিরিয়ালাইজার ব্যবহার করে, আপনি যে ক্ষেত্রগুলিতে এটির সংজ্ঞা দিয়েছেন সেগুলি সম্মান করে, পাশাপাশি কোনও সমিতি ইত্যাদি ing
django.core
। ক্যুরিসেটটি সিরিয়াল ব্যবহার না করার কোনও বিশেষ কারণ?