我正在通过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)
或许订单根本没关系,我错误地解决了问题?
答案 0 :(得分:0)
首先,如果你以后要使用某个类,必须先定义它。定义顺序很重要,你不能使用一个尚不存在的类。
其次,sqlalchemy说你将定义第三个表来创建关系。如果使用此方法,User和Follow类将不会访问其他属性,因此不会导致定义顺序错误。
最后,如果您不能定义关联表,那么您必须按正确的顺序放置类,以使用它们的属性。