【问题标题】:sqlalchemy make columns follow relationship with rulessqlalchemy 使列遵循与规则的关系
【发布时间】:2017-10-26 09:13:39
【问题描述】:

如何让 attr 成为被检查列的名称并为被检查列的值赋值?

models.py

class Dates(db.Model):
    username=db.Column(db.String, primary_key=True)
    apples = db.Column(db.DateTime)
    oranges = db.Column(db.DateTime)
    milk = db.Column(db.DateTime)
    bananas = db.Column(db.DateTime)
    beans = db.Column(db.DateTime)

    def is_expired(self, date)
        #I want attr to equal the column it is coming from
        #example if I typed Dates.apples.is_expired('2017-01-01')
        #I want attr to equal 'apples', that way Rules.rule brings back
        # the rule # associated with apples
        #I want value to be the date from Dates.apples
        a=Rules.query.filter_by(name=attr).first()
        if a.rule=='1':
            value=datetime.datetime.strptime(value, '%Y-%m-%d')
            date=datetime.datetime.strptime(date, '%Y-%m-%d')
            for i in range(36):
                value=add_one_month(value)
            if date>value:
                return True
            else:
                return False
        elif a.rule=='2':
            value=datetime.datetime.strptime(value, '%Y-%m-%d')
            date=datetime.datetime.strptime(date, '%Y-%m-%d')
            for i in range(12):
                value=add_one_month(value)
            if date>value:
                return True
            else:
                return False

    def __repr__(self):  # pragma: no cover
        return '<Mobility %r>' % (self.username)

class Rules(db.model)
    rule=db.Column(db.Integer, primary_key=True)
    name=db.Column(db.String(45))

    def __repr__(self):  # pragma: no cover
        return '<Mobility %r>' % (self.name)

另一个函数中的调用示例:

user=Dates.query.filter_by(username='bob').first()
user.apples='2017-02-11'
if user.apples.is_expired('2017-04-12'):
    color=red

在这种情况下 attr='apples', value='2017=02-11'

【问题讨论】:

  • attr 方法内部没有已知的attr 对象,可能应该是date
  • 您的a 对象也有Query 类型,而不是Rules,可能您忘记添加.first(),如a=Rules.query.filter_by(name=attr).first()
  • 还有value 对象的来源(同样在is_expired 方法内部)?
  • 强调“可能”这个词。你的问题也有点不清楚你在追求什么。无法验证的代码示例没有帮助。

标签: python python-2.7 sqlalchemy flask-sqlalchemy


【解决方案1】:

如果你想在函数中包含attr,你应该将它作为参数传递。 这实际上与 SQLAlchemy 无关——python 对象的工作方式与您在此处尝试使用它的方式不同:object.attr.method() 不是调用object 方法的有效方式。

相反,您需要user.is_expired('apples', '2017-04-12') 之类的东西。在方法内部,您可以将字段值设为getattr(self, attr_name),假设您将方法签名更改为def is_expired(self, attr_name, date)

【讨论】:

    猜你喜欢
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多