簡體   English   中英

Flask-SQLAlchemy-向查詢添加新列以傳遞給模板

[英]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 %}

根據您的描述,我了解您的BookCheckout關系是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM