Flask-SQLAlchemy:declared_attr 确实更改了 __tablename__ 但指向或仍在访问同一个表

问题描述 投票:0回答:1

我在 sqlite 文件中有两个表,user 和 user_us。两个表具有相同的结构。我尝试使用一个类和一个继承的类来使用声明的属性修饰来访问两者。如果被访问的表不会被这个声明的属性改变,那么这样做有什么意义呢?我做错了什么?

class User(db.Model):
    @declared_attr
    def __tablename__(cls) -> str:
        return str(cls.__name__.lower())

    id = db.Column(db.Integer, primary_key=True)

class User_us(User):
    pass
print(f'Test state: {User_us.__tablename__} {(User_us.__table__.name)}') 

给出输出:

Test state: user_us user

我期待的是: 测试状态:user_us user_us 以及访问的表是user_us。

使用:

Flask-SQLAlchemy==3.1.1
SQLAlchemy==2.0.30
flask flask-sqlalchemy
1个回答
0
投票

深入探索后,我发现这里不需要声明的_attr,因为在内部类名会变成小写,并使用我试图在这里声明它的方式

__tablename__
Reference

要继承一个类并重用它,我发现的优雅方法是将

__abstract__ = True
用于
general_model
,然后在其他两个类中继承它。

class general_model(db.Model):
    __abstract__ = True
    id = db.Column(db.Integer, primary_key=True)

class User(general_model):
    pass

class User_US(general_model):
    pass

print(f'Test state: {user_us.__tablename__} {(user_us.__table__.name)}') 

这可以工作并打印。

Test state: user_us user_us
正如我所料。

© www.soinside.com 2019 - 2024. All rights reserved.