मैं इस समस्या में भाग गया जब मैंने Peewee के मॉडल को PostgreSQL में संग्रहीत करने की कोशिश की JSONField
।
कुछ समय तक संघर्ष करने के बाद, यहाँ सामान्य समाधान है।
मेरे समाधान की कुंजी पायथन के स्रोत कोड से गुजर रही है और यह महसूस करते हुए कि कोड प्रलेखन ( यहां वर्णित ) पहले से ही json.dumps
अन्य डेटा प्रकारों का समर्थन करने के लिए मौजूदा का विस्तार करने का तरीका बताता है ।
मान लें कि आपके पास वर्तमान में एक मॉडल है जिसमें कुछ फ़ील्ड शामिल हैं जो JSON के लिए अनुक्रमिक नहीं हैं और मॉडल में 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
पायथन से आपको प्राप्त होने वाली हर एक शिकायत के लिए , केवल अनजाने-से-JSON प्रकार (जैसे 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 मॉडल को नीचे दिए गए JSON-seriazable ऑब्जेक्ट के रूप में बदल सकते हैं:
peewee_model = WhateverPeeweeModel()
new_model = SomeClass()
new_model.json_field = model_to_dict(peewee_model)
हालांकि ऊपर का कोड Peewee के लिए विशिष्ट (कुछ हद तक) था, लेकिन मुझे लगता है:
- यह सामान्य रूप से अन्य ORM (Django, आदि) पर लागू होता है
- इसके अलावा, यदि आप समझते हैं कि कैसे
json.dumps
काम करता है, तो यह समाधान सामान्य रूप से भी पायथन (ओएनएम ओआरएम) के साथ काम करता है
कोई प्रश्न, टिप्पणी अनुभाग में पोस्ट करें। धन्यवाद!