首页 文章

当两个模型在flask-sqlalchemy中继承相同的对象时获得警告

提问于
浏览
0

我有如下对象:

class FriendshipLike(object):
__table_args__ = (
    db.UniqueConstraint('requesting_user_id', 'accepting_user_id', 'status',
                        name='unique_friendship'),
)
id = db.Column(db.Integer, primary_key=True, nullable=False)
date = db.Column(db.DateTime(), nullable=False,
                 default=datetime.datetime.now())

@declared_attr
def requesting_user_id(cls):
    return db.Column('requesting_user_id', db.Integer, db.ForeignKey(
        'user.id'), nullable=False)

@declared_attr
def accepting_user_id(cls):
    return db.Column('accepting_user_id', db.Integer, db.ForeignKey('user.id'),
                     nullable=False)

和两个模型如下:

class Friendship(FriendshipLike, db.Model, CRUDMixin):
__tablename__ = 'friendship'

class Flirt(FriendshipLike, db.Model, CRUDMixin):
__tablename__ = 'flirt'

我收到了警告

SAWarning:表格中的'reques_user_id'列('friendship',MetaData(bind = None),Column('id',Integer(),table =,primary_key = True,nullable = False),列('date', DateTime(),table =,nullable = False,default = ColumnDefault(datetime.datetime(2017,5,15,10,0,47,646868))),Column('status',Enum('accepted','pending) ','跟','拒绝'),table =,nullable = False,默认= ColumnDefault('pending')),Column('reques_user_id',Integer(),ForeignKey('user.id'),table =, nullable = False),Column('accepting_user_id',Integer(),ForeignKey('user.id'),table =,nullable = False),schema = None)被Column('reques_user_id',Integer(),ForeignKey替换) ('user.id'),table =,nullable = False),它具有相同的密钥 . 考虑use_labels用于select()语句 .

有没有办法让这个警告去?或者我不应该担心它只是给我警告,以便我在发表声明时要小心?

1 回答

  • 3

    问题的根源是 FriendshipLike 及其子类之间共享的 __table_args__ 属性 . 这也应该是 declared_attr ,否则使用mixin的子类的 Table 实例将尝试共享相同的 UniqueConstraint 对象,这似乎会导致各种奇怪的行为 . 只需将其转入 declared_attr

    class FriendshipLike(object):
    
        @declared_attr
        def __table_args__(cls):
            return (
                db.UniqueConstraint('requesting_user_id',
                                    'accepting_user_id',
                                    'status',
                                    name='unique_friendship'),
            )
    
        id = db.Column(db.Integer, primary_key=True, nullable=False)
        date = db.Column(db.DateTime(), nullable=False,
                         default=datetime.datetime.now())
    
        @declared_attr
        def requesting_user_id(cls):
            return db.Column('requesting_user_id', db.Integer, db.ForeignKey(
                'user.id'), nullable=False)
    
        @declared_attr
        def accepting_user_id(cls):
            return db.Column('accepting_user_id', db.Integer, db.ForeignKey('user.id'),
                             nullable=False)
    

    并且警告消失了 . 有一个在mixins here中定义索引的例子 . 请注意,您不需要显式命名 declared_attr 属性返回的 Column 对象,因为a column is automatically named after the attribute it is assigned to .

相关问题