当以类似方式访问时,为什么SQLAlchemy关系以不同方式返回?

时间:2018-05-10 15:52:16

标签: python sqlalchemy flask-sqlalchemy

使用这个简化的模型:

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实际上会让我得到我想要的东西,但我仍然希望了解这种行为。

1 个答案:

答案 0 :(得分:0)

SQLAlchemy使用元类来构建模型,这使它可以做各种魔术。当您声明User类时,它会在顶层查找属性为列,关系等的属性,并将它们更改为不同的属性。您可以检查并发现isinstance(User.id, db.Column)为false。但它不会像字典那样在其他东西中拾取这些对象。