说,我们有以下关系:
所以,这是一个多对多的关系.我有三个表:电子邮件,提供商和用户.电子邮件有两个外国ID供提供者和用户使用.
现在,给定一个特定的人,我想打印所有电子邮件提供商及其为此人托管的电子邮件地址(如果存在).(如果此人没有Gmail上的电子邮件,我仍然希望Gmail出现在结果中.我相信否则我只需要一个左内联接即可解决此问题.)
我想出了如何使用以下子查询执行此操作(遵循sqlalchemy教程):
email_subq = db.session.query(Emails).\
filter(Emails.user_id==current_user.id).\
subquery()
provider_and_email = db.session.query(Provider, email_subq).\
outerjoin(email_subq, Provider.emails).\
all()
Run Code Online (Sandbox Code Playgroud)
这工作正常(它返回一个4元组(Provider, user_id, provider_id, email_address),我想要的所有信息),但我后来发现这不是使用Flask BaseQuery类,因此paginationFlask-SQLAlchemy提供的功能不起作用.显然db.session.query()不是Flask-SQLAlchemy Query实例.
我试图这样做,Emails.query.outerjoin[...]但只返回电子邮件表中的列,虽然我想要提供商信息和电子邮件.
我的问题:我如何使用Flask-SQLAlchemy做同样的事情,这样我就不必重新实现已经存在的分页?
我想在这一点上最简单的选择是实现我自己的paginate函数,但是我想知道是否有另一种正确的方法可以做到这一点.
如果我有一个容器和一个项目列表,我可能有以下HTML标记:
<div class="container food foodcontainer">
<ul class="list foodlist">
<li class="listitem fooditems"></li>
...
Run Code Online (Sandbox Code Playgroud)
我可以用两种方式设置它们(假设使用纯CSS而不是/ sass或任何其他帮助器).首先,就像通常会做的那样:
.food { /* style */ }
.food .list { /* style */ }
.food .list .listitems { /* style */ }
Run Code Online (Sandbox Code Playgroud)
或者,我可以通过详细的描述性类名简单地引用所有内容:
.foodcontainer { /* style */ }
.foodlist { /* style */ }
.fooditems { /* style */ }
Run Code Online (Sandbox Code Playgroud)
没有更多的级联关系!是否有理由不为所有内容执行此操作(以便每个元素都由单个类/ id名称引用)?我(以及在相同代码库上工作的人)根本没有发现在可读性方面要好得多; 如果有的话,我们会发现更容易掌握的独特和直接名称,也更容易搜索.
有一篇古老的文章,通常建议更短,更独特的选择器,以提高性能; 在最近的更新中,据说整体性能已经发生了变化.但是好多少?更短的路还更快吗?