You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:46:12