2017-05-25 26 views
1

我如何獲得attr作爲被檢查列的名稱並且值被檢查的列的值?sqlalchemy使列遵循與規則的關係

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 = '蘋果',值= '2017 = 02-11'

+0

'is_expired'方法中沒有'attr'對象,也許它應該是'date'? –

+0

你的''''對象的類型是'Query',而不是'Rules',可能你忘記了像'a = Rules.query.filter_by(name = attr).first()'添加'.first() ? –

+0

還有'value'對象來自哪裏(再次在'is_expired'方法內)? –

回答

1

如果你想在函數內部有attr,你應該把它作爲參數傳遞。 這實際上並不是關於SQLAlchemy - python對象在你嘗試在這裏使用的方式不起作用:object.attr.method()不是調用object的方法的有效方法。

相反,您需要類似user.is_expired('apples', '2017-04-12')。在該方法中,假設您將方法簽名更改爲def is_expired(self, attr_name, date),您可以將字段值設爲getattr(self, attr_name)