繁体   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