使用这个简化的模型:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
# other attributes
#user many-to-many size associations (using link tables)
sz_shirt_dress_sleeve = db.relationship(
'SizeKeyShirtDressSleeve',
secondary=LinkUserSizeShirtDressSleeve,
backref=db.backref('users', lazy='dynamic'))
strange = {'whyisthisdifferent': db.relationship(
'SizeKeyShirtDressNeck',
secondary=LinkUserSizeShirtDressNeck,
backref=db.backref('users', lazy='dynamic'))}
我认为我可以使用这两者来访问这种关系,但事实并非如此。请参阅此交互式会话:
>>> from app import db
>>> from app.models import User
>>> u1 = User.query.first()
>>> u1
<User id: 1, email: 'admin@admin.com', password_hash: 'pbkdf2:sha256:50000$n2qsqVfu$8d1bc6b0a472818175c21c1a31031ece58e78feca9c6d15a326b28bd7fd80e67'>
>>> u1.strange['whyisthisdifferent']
<RelationshipProperty at 0x106c6d248; no key>
>>> u1.sz_shirt_dress_sleeve
[Dress shirt sleeve size: 3000]
当u1.sz_shirt_dress_sleeve
返回关系签名时,为什么u1.strange['whyisthisdifferent']
访问实际上会返回查询结果?这让我想起了返回函数定义或函数文字之间的Javascript差异,但这不是Javascript。
我相信阅读SQLAlchemy Association Proxy documentation实际上会让我得到我想要的东西,但我仍然希望了解这种行为。
答案 0 :(得分:0)
SQLAlchemy使用元类来构建模型,这使它可以做各种魔术。当您声明User类时,它会在顶层查找属性为列,关系等的属性,并将它们更改为不同的属性。您可以检查并发现isinstance(User.id, db.Column)
为false。但它不会像字典那样在其他东西中拾取这些对象。