Проблемы с Sqlalchemy `hybrid_property` - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь реализовать гибридное свойство, которое позволило бы запрашивать пользователя по его текущей подписке.

Я определил свойство is_expired в модели UserSubscription.Затем я понял, что это должно быть гибридное свойство, чтобы его можно было запрашивать на уровне класса.Но это все равно не будет работать.

Сообщение об ошибке находится внизу фрагмента кода.

''' Models '''
class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String, unique=True)
    subscriptions = db.relationship(
        'UserSubscription', back_populates='user'
    )

    @property
    def current_subscription(self):
        try:
            return UserSubscription.query.filter_by(user_id=self.id, is_active=True, is_expired=False).one()
        except NoResultFound:
            return None

class UserSubscription(db.Model):
    __tablename__ = 'user_subscription'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    subscription_id = db.Column(db.Integer, db.ForeignKey('subscription.id'), default=0) # 0 for free

    subscribed_on = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now())
    is_active = db.Column(db.Boolean, nullable=False, default=True)

    user = db.relationship('User', back_populates='subscriptions')
    subscription = db.relationship('Subscription', back_populates='users')

    @hybrid_property
    def subscription_expiry(self):
        return datetime.timedelta(days=self.subscription.expiry_time) + self.subscribed_on

    @hybrid_property
    def is_expired(self):
        if self.subscription_expiry <= datetime.datetime.now(): return True
        else: return False


>>> my_user.current_subscription
E           sqlalchemy.exc.InvalidRequestError: Entity '<class 
'.models.UserSubscription'>' has no property 'is_expired'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...