FastAPI中Customer对象无json属性问题排查求助
问题描述
我定义了如下两个SQLAlchemy模型:
class Customer(Base): __tablename__ = "customer" id = Column(Integer, primary_key=True,index=True) name = Column(String(256)) mobile = Column(String(256))
class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) email = Column(String(256)) mobile = Column(String(256))
查询User模型时,调用data.json()可正常输出JSON格式数据:
def get_user(db: Session, id: int): data=db.query(models.User).filter(models.User.id == id).first() print(data) ## <db.models.User object at 0x7f6902d8e340> print(data.json()) ##{'mobile': '11111111', 'id': 1, 'email': None}
但查询Customer模型时,调用data.json()出现错误:AttributeError: 'Customer' object has no attribute 'json'
查询代码如下:
def get_referal_details_lms(db1: Session, mobile:str): data= db1.query(models.Customer).filter(models.Customer.mobile == mobile).first() print (data) ## <db.models.Customer object at 0x7f6902d8e340> print (data.json()) ##AttributeError: 'Customer' object has no attribute 'json' return data
已确认不是数据库会话问题,请问该问题原因是什么?如何解决?
原因分析
你的User类中显式定义了json()方法,但Customer类未实现该方法。SQLAlchemy的Base基类本身不提供默认的json()序列化方法,因此只有实现了该方法的模型实例才能调用它。
解决方法
方法1:给Customer类添加json()方法
直接在Customer类中手动实现序列化方法:class Customer(Base): __tablename__ = "customer" id = Column(Integer, primary_key=True,index=True) name = Column(String(256)) mobile = Column(String(256)) def json(self): return { "id": self.id, "name": self.name, "mobile": self.mobile }方法2:定义通用序列化基类
若多个模型需要序列化功能,可创建抽象基类统一实现json()方法,避免重复代码:class BaseModel(Base): __abstract__ = True # 标记为抽象类,不会生成数据库表 def json(self): # 自动遍历模型所有列,生成序列化字典 return {column.name: getattr(self, column.name) for column in self.__table__.columns} # 修改模型继承关系 class Customer(BaseModel): __tablename__ = "customer" id = Column(Integer, primary_key=True,index=True) name = Column(String(256)) mobile = Column(String(256)) class User(BaseModel): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) email = Column(String(256)) mobile = Column(String(256))方法3:直接利用模型实例的字典属性
无需额外定义方法,通过过滤模型实例的__dict__属性实现序列化:def get_referal_details_lms(db1: Session, mobile:str): data= db1.query(models.Customer).filter(models.Customer.mobile == mobile).first() if data: # 过滤掉SQLAlchemy内部的私有属性 serialized_data = {k: v for k, v in data.__dict__.items() if not k.startswith('_')} print(serialized_data) return data
内容的提问来源于stack exchange,提问作者putta
相关产品推荐
相关产品推荐

