কর্নারের কেস হ্যান্ডলিং এবং কাঙ্ক্ষিত ফলাফলের ঘনিষ্ঠতা বিভিন্ন ডিগ্রী সহ একটি অভিধানে একটি উদাহরণকে রূপান্তর করার অনেকগুলি উপায় রয়েছে।
1। instance.__dict__
instance.__dict__
যা ফিরে আসে
{'_foreign_key_cache': <OtherModel: OtherModel object>,
'_state': <django.db.models.base.ModelState at 0x7ff0993f6908>,
'auto_now_add': datetime.datetime(2018, 12, 20, 21, 34, 29, 494827, tzinfo=<UTC>),
'foreign_key_id': 2,
'id': 1,
'normal_value': 1,
'readonly_value': 2}
এটি এখন পর্যন্ত সবচেয়ে সহজ, তবে নিখোঁজ রয়েছে many_to_many
, foreign_key
ভুল নাম দেওয়া হয়েছে এবং এতে এতে দুটি অযাচিত অতিরিক্ত জিনিস রয়েছে।
2। model_to_dict
from django.forms.models import model_to_dict
model_to_dict(instance)
যা ফিরে আসে
{'foreign_key': 2,
'id': 1,
'many_to_many': [<OtherModel: OtherModel object>],
'normal_value': 1}
এটিই একমাত্র many_to_many
, তবে অখাদ্য ক্ষেত্রগুলি অনুপস্থিত।
3। model_to_dict(..., fields=...)
from django.forms.models import model_to_dict
model_to_dict(instance, fields=[field.name for field in instance._meta.fields])
যা ফিরে আসে
{'foreign_key': 2, 'id': 1, 'normal_value': 1}
এটি আদর্শ model_to_dict
আহ্বানের চেয়ে কঠোরভাবে খারাপ ।
4। query_set.values()
SomeModel.objects.filter(id=instance.id).values()[0]
যা ফিরে আসে
{'auto_now_add': datetime.datetime(2018, 12, 20, 21, 34, 29, 494827, tzinfo=<UTC>),
'foreign_key_id': 2,
'id': 1,
'normal_value': 1,
'readonly_value': 2}
instance.__dict__
অতিরিক্ত ক্ষেত্র ব্যতীত এটি একই আউটপুট ।
foreign_key_id
এখনও ভুল এবং many_to_many
এখনও নিখোঁজ।
5. কাস্টম ফাংশন
জাঙ্গোর জন্য কোডটির model_to_dict
বেশিরভাগ উত্তর ছিল। এটি স্পষ্টতই অ-সম্পাদনযোগ্য ক্ষেত্রগুলি সরিয়ে ফেলেছে, তাই সেই চেকটি সরিয়ে ফেলতে এবং অনেকের কাছে বহু ক্ষেত্রের জন্য বিদেশী কীগুলির আইডিগুলি পাওয়ার ফলে নিম্নলিখিত কোডটি যা কাঙ্ক্ষিত হিসাবে আচরণ করে ফলাফল:
from itertools import chain
def to_dict(instance):
opts = instance._meta
data = {}
for f in chain(opts.concrete_fields, opts.private_fields):
data[f.name] = f.value_from_object(instance)
for f in opts.many_to_many:
data[f.name] = [i.id for i in f.value_from_object(instance)]
return data
যদিও এটি সবচেয়ে জটিল বিকল্প, কলিং to_dict(instance)
আমাদের ঠিক পছন্দসই ফলাফল দেয়:
{'auto_now_add': datetime.datetime(2018, 12, 20, 21, 34, 29, 494827, tzinfo=<UTC>),
'foreign_key': 2,
'id': 1,
'many_to_many': [2],
'normal_value': 1,
'readonly_value': 2}
Ser. সিরিয়ালাইজার ব্যবহার করুন
জ্যাঙ্গো রেস্ট ফ্রেমওয়ার্কের মডেলসিরিয়েজার আপনাকে একটি মডেল থেকে স্বয়ংক্রিয়ভাবে একটি সিরিয়াল তৈরি করতে দেয়।
from rest_framework import serializers
class SomeModelSerializer(serializers.ModelSerializer):
class Meta:
model = SomeModel
fields = "__all__"
SomeModelSerializer(instance).data
আয়
{'auto_now_add': '2018-12-20T21:34:29.494827Z',
'foreign_key': 2,
'id': 1,
'many_to_many': [2],
'normal_value': 1,
'readonly_value': 2}
এটি কাস্টম ফাংশনের মতো প্রায় ভাল, তবে অটো_নো_এডিডি একটি ডেটটাইম অবজেক্টের পরিবর্তে একটি স্ট্রিং।
বোনাস রাউন্ড: আরও ভাল মডেল মুদ্রণ
যদি আপনি এমন একটি জাঙ্গো মডেল চান যা একটি অজগর কমান্ড-লাইন প্রদর্শন করতে পারে তবে আপনার মডেলগুলি নিম্নোক্ত শিশু-শ্রেণিতে থাকুন:
from django.db import models
from itertools import chain
class PrintableModel(models.Model):
def __repr__(self):
return str(self.to_dict())
def to_dict(instance):
opts = instance._meta
data = {}
for f in chain(opts.concrete_fields, opts.private_fields):
data[f.name] = f.value_from_object(instance)
for f in opts.many_to_many:
data[f.name] = [i.id for i in f.value_from_object(instance)]
return data
class Meta:
abstract = True
সুতরাং, উদাহরণস্বরূপ, আমরা যদি আমাদের মডেলগুলি এরূপ হিসাবে সংজ্ঞায়িত করি:
class OtherModel(PrintableModel): pass
class SomeModel(PrintableModel):
normal_value = models.IntegerField()
readonly_value = models.IntegerField(editable=False)
auto_now_add = models.DateTimeField(auto_now_add=True)
foreign_key = models.ForeignKey(OtherModel, related_name="ref1")
many_to_many = models.ManyToManyField(OtherModel, related_name="ref2")
কলিং SomeModel.objects.first()
এখন এইভাবে আউটপুট দেয়:
{'auto_now_add': datetime.datetime(2018, 12, 20, 21, 34, 29, 494827, tzinfo=<UTC>),
'foreign_key': 2,
'id': 1,
'many_to_many': [2],
'normal_value': 1,
'readonly_value': 2}
to_dict
এবং এটি আপনার পছন্দ মতো পরিচালনা করতে পারেন।