使用Flask-SQLAlchemy定义关联对象,相关表的顺序?

时间:2017-02-13 04:59:59

标签: sqlalchemy flask-sqlalchemy

我正在通过Miguel Grinberg的Flask书。

在第12章中,他让您定义一个关联对象关注与关注者和所遵循的关注对象,两者都映射到用户,以及添加关注者并跟随到Users类。

我最初将关联表放在User表之后,并在运行 python manage.py db upgrade 时出错:

line 75, in User followed = db.relationship('Follow', foreign_keys=  [Follow.follower_id], 
NameError: name 'Follow' is not defined

然后我移动类User 定义上方的关联对象 class Follow ,并重新运行迁移。这次它奏效了。

有人能解释一下这个原因吗?

两个类定义似乎都需要另一个。

一般来说,我应该知道关于flask-sqlalchemy,sqlalchemy或ORM的一些事情吗?

SQLAlchemy文档说"we can define the association_table at a later point, as long as it’s available to the callable after all module initialization is complete",关系在类本身中定义。

也就是说,对于您正在使用的情况和association_table来显示两个单独模型之间的关系。我在Flask-SQLAlchemy或SQLAlchemy文档中没有看到关于这个案例的任何内容,但是当我看到它时,我很可能没有认出答案。

class User(UserMixin, db.Model):
    __tablename__ = 'users'
    ...
    followed = db.relationship('Follow',
                           foreign_keys=[Follow.follower_id],
                           backref=db.backref('follower', lazy='joined'),
                           lazy='dynamic',
                           cascade='all, delete-orphan')
    followers = db.relationship('Follow',
                            foreign_keys=[Follow.followed_id],
                            backref=db.backref('followed', lazy='joined'),
                            lazy='dynamic',
                            cascade='all, delete-orphan')

定义顺序:

class Follow(db.Model):
    __tablename__ = 'follows'
    follower_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
    followed_id = db.Column(db.Integer, db.ForeignKey('users.id'), primary_key=True)
    timestamp = db.Column(db.DateTime, default=datetime.utcnow)

或许订单根本没关系,我错误地解决了问题?

1 个答案:

答案 0 :(得分:0)

首先,如果你以后要使用某个类,必须先定义它。定义顺序很重要,你不能使用一个尚不存在的类。

其次,sqlalchemy说你将定义第三个表来创建关系。如果使用此方法,User和Follow类将不会访问其他属性,因此不会导致定义顺序错误。

最后,如果您不能定义关联表,那么您必须按正确的顺序放置类,以使用它们的属性。