При аналогичном обращении почему отношение SQLAlchemy возвращается по-другому? - PullRequest
0 голосов
/ 10 мая 2018

С этой упрощенной моделью:

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 действительно даст мнечто я хочу, но я все еще хотел бы понять это поведение.

1 Ответ

0 голосов
/ 10 мая 2018

SQLAlchemy использует метаклассы для построения моделей, что позволяет ему творить все виды магии.Когда вы объявляете класс User, он ищет атрибуты на верхнем уровне, которые представляют собой столбцы, отношения и т. Д., И изменяет их на что-то другое.Вы можете проверить и обнаружить, что isinstance(User.id, db.Column) неверно.Но он не собирает эти объекты внутри чего-то другого, например словаря.

...