2016-01-18 3 views
0

У меня есть User и Expense классы. У одного пользователя есть список расходов. Я хотел бы добавить свойство current_expenses, которое возвращает только список расходов, которые находятся в текущем месяце. Очевидно, что я могу сделать:SQLAlchemy способ фильтрации свойства экземпляра

class User(db.Model): 

    ... 

    def current_expenses(): 
     now = datetime.datetime.now() 
     db.session.query(Expense)\ 
      .filter(User.name = self.name)\ 
      .filter(db.extract('year', Expense.date_time) == now.year)\ 
      .filter(db.extract('month', Expense.date_time) == now.month) 
     ... 

Но это кажется глупым, так как SQLAlchemy уже есть перечень расходов, связанных с пользовательским экземпляром. Есть ли лучший способ получить эти данные?

ответ

1

Если вы хотите выполнить запрос по расходам пользователя, вы можете настроить связь как dynamic, которая вернет объект запроса для расходов пользователей.

class Expense(Base): 
    __tablename__ = 'expense' 
    id = Column(Integer, primary_key=True) 
    amount = Column(Integer) 
    user_id = Column(Integer, ForeignKey('user.id')) 
    date_time = Column(DateTime, default=datetime.datetime.now) 

class User(Base): 
    __tablename__ = 'user' 
    id = Column(Integer, primary_key=True) 
    expenses = relationship("Expense", lazy='dynamic') 

    @hybrid_property 
    def current_expenses(self): 
     now = datetime.datetime.now() 
     ret = self.expenses.filter(extract('month', Expense.date_time) == now.month).all() 

     return ret 

e1 = Expense(amount=400) 
e2 = Expense(amount=300) 
u1 = User() 
u1.expenses = [e1, e2] 

session.add(u1) 

print u1.current_expenses 

В качестве альтернативы, если вы используете жадную загрузку по умолчанию, вы можете просто отфильтровать список Python расходов, подключенных к экземпляру модели.

class User(Base): 
    __tablename__ = 'user' 
    id = Column(Integer, primary_key=True) 
    expenses = relationship("Expense") 

    @hybrid_property 
    def current_expenses(self): 
     now = datetime.datetime.now() 
     ret = [e for e in self.expenses if e.date_time.month == now.month] 

     return ret 
Смежные вопросы