Peewee modelini PostgreSQL JSONField
da saqlashga harakat qilganimda bu muammoga duch keldim.
Biroz kurashgandan so'ng, umumiy yechim.
Mening yechimimning kaliti Python-ning manba kodidan o'tish va kod hujjatlari (ta'riflangan bu yerda) boshqa ma'lumotlar turlarini qo'llab-quvvatlash uchun mavjud json.dumps
ni qanday kengaytirishni allaqachon tushuntirib beradi.
Aytaylik, sizda JSON uchun ketma-ketlashtirib bo'lmaydigan ba'zi maydonlarni o'z ichiga olgan model mavjud va JSON maydonini o'z ichiga olgan model dastlab shunday ko'rinadi:
class SomeClass(Model):
json_field = JSONField()
Shunchaki maxsus JSONEncoder
belgilang:
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)
Va keyin uni quyidagi kabi JSONField
da foydalaning:
class SomeClass(Model):
json_field = JSONField(dumps=CustomJsonEncoder.json_dumper)
Kalit yuqoridagi default(self, obj)
usulidir. Python’dan kelgan har bir ... is not JSON serializable
shikoyat uchun seriyali bo‘lmagan JSON turiga (masalan, Enum
yoki datetime
) ishlov berish uchun kod qo‘shing.
Misol uchun, men Enum
dan meros bo'lgan sinfni qanday qo'llab-quvvatlayman:
class TransactionType(Enum):
CURRENT = 1
STACKED = 2
def default(self, obj):
if isinstance(obj, TransactionType):
return obj.value
return json.JSONEncoder.default(self, obj)
Nihoyat, yuqoridagi kabi amalga oshirilgan kod bilan siz har qanday Peewee modellarini quyidagi kabi JSON-seriyali ob'ektga aylantirishingiz mumkin:
peewee_model = WhateverPeeweeModel()
new_model = SomeClass()
new_model.json_field = model_to_dict(peewee_model)
Yuqoridagi kod (bir oz) Peewee-ga xos bo'lsa-da, lekin menimcha:
- Bu umuman boshqa ORM (Django va boshqalar) uchun amal qiladi
- Bundan tashqari, agar siz
json.dumps
qanday ishlashini tushunsangiz, bu yechim umuman Python (sans ORM) bilan ham ishlaydi.
Har qanday savol, iltimos, sharhlar bo'limiga yozing. Rahmat!
person
sivabudh
schedule
30.07.2018
import jsons
quyidagi javobga qarang - u juda yaxshi ishlaydi - person tswaehn   schedule 02.04.2020.to_dict()
funksiyasini yoki uni ketma-ketlashtirishga harakat qiladigan modulga o'tishdan oldin ob'ektga chaqirilishi mumkin bo'lgan narsalarni amalga oshirishim kerak. - person Felix B.   schedule 01.09.2020vars
funksiyasidanjson.dumps
bilan birgalikda foydalanishingiz mumkin (mening javobimga qarang stackoverflow.com/a/64469761/1587520 ) - person user1587520   schedule 23.11.2020