1、实体基类
from sqlalchemy.orm import InstrumentedAttribute
from sqlalchemy.orm.util import AliasedClass
class ModelBase(object):
fields = None
def __init__(self):
if not self.__class__.fields:
self.__class__.fields = [x.key for x in self.__mapper__.attrs]
def __iter__(self):
return next(self)
def __next__(self):
for key in self.__class__.fields:
value = getattr(self, key)
yield key, value
# 使用__new__更好一些
class ModelBase(object):
fields = None
def __new__(cls, *args, **kwargs):
if not cls.fields:
cls.fields = [x.key for x in cls.__mapper__.attrs]
return object.__new__(cls, *args, **kwargs)
def __iter__(self):
return next(self)
def __next__(self):
for key in self.__class__.fields:
value = getattr(self, key)
yield key, value
@classmethod
def get_aliased_fields(cls, a: AliasedClass):
# InstrumentedAttribute
field_list = list()
cls_dict = cls.__dict__
for key in cls_dict.keys():
if isinstance(cls_dict[key], InstrumentedAttribute):
# alised_key = key.replace(cls.__name__ + ".", "")
alised_key = key
field_list.append(a.__getattr__(alised_key))
2、实体类
class Arrive(ModelBase, db.Model):
__tablename__ = "Arrive"
ID = db.Column(db.BigInteger, primary_key=True, autoincrement=False, info='ID')
REG = db.Column(db.String(10), nullable=False, info='编号')
3、测试
def test_arrive(self):
entity = Arrive()
entity.ID = 1
entity.REG = 'T320'
js = json.dumps(dict(entity))
print(js)
self.assertTrue(js)
4、输出结果
{"ID": 1, "REG": "T320"}