[英]Flask-SQLAlchemy - adding a new column to a query to pass to a template
對於Flask中帶有Flask-SQLAlchemy的簡單圖書館應用,我有一個Book表和一個Checkout表:
class Checkout(db.Model):
id = db.Column(db.Integer, primary_key=True)
checkout_date = db.Column(db.DateTime, nullable=False, default=func.now())
return_date = db.Column(db.DateTime)
book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
book = db.relationship('Book',
backref=db.backref('checkout', lazy='dynamic'))
def __repr__(self):
return '<Checkout Book ID=%r from %s to %s>' % (self.book.id, self.checkout_date, self.return_date)
我想保留所有結帳記錄,並且我認為執行此操作的標准化方法是使用Checkout.return_date
來確定是否退還該書。 如果任何關聯的Checkout記錄的返回日期為空,則該書仍被檢出,如果沒有空記錄,則該書為“可用”。 (真的,它永遠不能有兩個null return_dates)
該視圖的SQL為:
select book.*, min(checkout.return_date is not null) as available
from book
left join checkout
on book.id = checkout.book_id
group by book.id;
我無法弄清楚如何在SQLAlchemy中做到這一點,而無需弄清楚並使用原始SQL字符串:
db.session.query(Book).from_statement('select book.*, min(checkout.return_date is not null) as available from book left join checkout on book.id = checkout.book_id group by book.id').all()
但是我無法訪問spam_book.available
:我收到錯誤'Book' object has no attribute 'available'
有沒有一種方法可以在Book上添加動態的臨時屬性以傳遞給模板? 還是有更好的方法來做到這一點?
我的最終目標是能夠在模板中為每本書進行{% if book.available %}
。
根據您的描述,我了解您的Book
與Checkout
關系是OneToMany,並且您正在執行以下操作:
book_id
嘗試為您的Book
模型添加方法。
class Book(db.Model):
# ...something you already have
def is_available(self):
return not self.checkout.filter(Checkout.return_date.isnot(None)).scalar()
在模板中,只需使用:
{% if book.is_available %}
應該可以。
這沒有經過測試,因為我手頭沒有SQLAlchemy。 請告訴我它是否無效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.