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 jsonsquyidagi 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.2020varsfunksiyasidanjson.dumpsbilan birgalikda foydalanishingiz mumkin (mening javobimga qarang stackoverflow.com/a/64469761/1587520 ) - person user1587520   schedule 23.11.2020