【问题标题】:How to get all related objects of every object in a queryset, filtered by another model in Sqlalchemy?如何获取查询集中每个对象的所有相关对象,由Sqlalchemy中的另一个模型过滤?
【发布时间】:2021-08-24 18:46:54
【问题描述】:

我正在使用 Sqlalchemy 学习 Flask,但遇到了这个问题。 假设我有 3 个模型:

class Author(db.Model):
    sex = db.Column(db.String) # Male or female
    zone = db.Column(db.String(1)) # (A or B)

class SellPlan(db.Model):
    is_open = db.Column(db.Boolean)
    has_discount = db.Column(db.Boolean)

class Book(db.Model):
    plan = db.Column(db.SellPlan, db.ForeignKey('SellPlan')) 
    author = db.Column(db.Author, db.ForeignKey('Author'))

每本书都有计划和作者的外键。 现在,我想查询 A 区的所有男性作者。而且我还想预取(如 Django 中的预取),每个拥有 PlanSell 的作者的所有书籍都已打开并有折扣(is_open=Truehas_discount=True ),所以我以后可以轻松访问数据,例如author.books。 我搜索了我发现我们可以使用joinedload(),但我仍然无法弄清楚如何按 PlanSell 的字段进行过滤 请帮帮我^^

【问题讨论】:

  • 你能通过一些例子来展示应该是什么结果。如果我没记错的话,那么您希望作者是男性并且有折扣并且 is_open 然后拿走他的书。
  • 是的。我想获得所有作者(男性,住在 A 区)的所有书籍(书籍需要按销售计划过滤(打开,并且有折扣)

标签: python sqlalchemy foreign-keys filtering flask-sqlalchemy


【解决方案1】:

我对您的代码进行了更改。您无需为 SellPlan 制作表格,而是将其包含在 Book 表格中。

class Author(db.Model):
    id =  db.Column(db.Integer, primary_key = True)
    sex = db.Column(db.String) 
    zone = db.Column(db.String(1))
    books = db.relationship("Book",backref="author")


class Book(db.Model):
    sno =   db.Column(db.Integer, primary_key = True)
    name =  db.Column(db.String(15))
    is_open = db.Column(db.Boolean)     
    has_discount = db.Column(db.Boolean)
    author_id = db.Column(db.Integer,db.ForeignKey("author.id"))

我添加了 id 和 sno,因为创建表需要主键。

现在您将添加如下数据:

p4 = Author(sex="male",zone="A")
b2 = Book(name=flask",is_open=True,has_discount=True,author=p4) 

访问您想要的数据:

b = []
a1 = Author.query.filter_by(sex="male",zone="A").all()
for i in a1:
     a = Book.query.filter_by(is_open=True,has_discount=True,author=i).first()
     b.append(a)

a1 有作者,b 有书籍(都是列表)

【讨论】:

  • 谢谢,@charchit,但这不是我想要的。一个销售计划可以有多个与之相关的书籍,SellPlan 必须是一个单独的表。而且我认为您的实施表现不佳。但我真的很感谢你的帮助^^
  • 欢迎,然后你可以阅读这个blog也许有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-02
  • 2021-01-14
  • 1970-01-01
  • 2010-12-14
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
相关资源
最近更新 更多