আমি যখন পিগ্রির মডেলটি পোস্টগ্রিজ এসকিউএলে সংরক্ষণ করার চেষ্টা করেছি তখন আমি এই সমস্যার মধ্যে পড়েছিলাম JSONField
।
কিছুক্ষণ লড়াই করার পরে, এখানে সাধারণ সমাধান।
আমার সমাধানের মূলটি পাইথনের উত্স কোডের মধ্য দিয়ে যাচ্ছেন এবং বুঝতে পেরেছেন যে কোড ডকুমেন্টেশন ( এখানে বর্ণিত ) ইতিমধ্যে ব্যাখ্যা করে যে কীভাবে json.dumps
অন্যান্য ডেটা ধরণের সমর্থন করতে বিদ্যমানটিকে প্রসারিত করতে হয়।
ধরুন আপনার বর্তমানের এমন একটি মডেল রয়েছে যার কিছু ক্ষেত্র রয়েছে যা JSON এর জন্য সিরিয়ালযোগ্য নয় এবং সেই মডেলটিতে জেএসওএন ক্ষেত্রটি মূলত এর মতো দেখাচ্ছে:
class SomeClass(Model):
json_field = JSONField()
কেবল এটির JSONEncoder
মতো একটি কাস্টম সংজ্ঞায়িত করুন :
class CustomJsonEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj, SomeTypeUnsupportedByJsonDumps):
return < whatever value you want >
return json.JSONEncoder.default(self, obj)
@staticmethod
def json_dumper(obj):
return json.dumps(obj, cls=CustomJsonEncoder)
এবং তারপরে এটি JSONField
নীচের মত আপনার ব্যবহার করুন :
class SomeClass(Model):
json_field = JSONField(dumps=CustomJsonEncoder.json_dumper)
কীটি default(self, obj)
উপরের পদ্ধতিটি। ... is not JSON serializable
পাইথন থেকে প্রাপ্ত প্রতিটি একক অভিযোগের জন্য, অপ্রয়োজনীয়-থেকে-জেএসওএন প্রকার (যেমন Enum
বা datetime
) হ্যান্ডেল করার জন্য কেবল কোড যুক্ত করুন
উদাহরণস্বরূপ, আমি এখানে ক্লাসিকৃত উত্তরাধিকার সূত্রে কীভাবে সহায়তা করি তা এখানে Enum
:
class TransactionType(Enum):
CURRENT = 1
STACKED = 2
def default(self, obj):
if isinstance(obj, TransactionType):
return obj.value
return json.JSONEncoder.default(self, obj)
শেষ অবধি, উপরের মত কোডটি প্রয়োগ করে আপনি কেবল যে কোনও পিউই মডেলকে নীচের মত জেএসওএন-সিরিয়াজেবল অবজেক্টে রূপান্তর করতে পারবেন:
peewee_model = WhateverPeeweeModel()
new_model = SomeClass()
new_model.json_field = model_to_dict(peewee_model)
যদিও উপরের কোডটি কিছুটা (কিছুটা) পেরুয়ের জন্য নির্দিষ্ট ছিল তবে আমি মনে করি:
- এটি অন্যান্য ওআরএম (জ্যাঙ্গো, ইত্যাদি) এর ক্ষেত্রে প্রযোজ্য
- এছাড়াও, যদি আপনি কীভাবে
json.dumps
কাজ করে তা বুঝতে পারেন তবে এই সমাধানটি পাইথন (স্যানস ওআরএম) এর সাথেও সাধারণভাবে কাজ করে
কোন প্রশ্ন, মন্তব্য বিভাগে পোস্ট করুন। ধন্যবাদ!