簡體   English   中英

SQLAlchemy為偉大的孫子代表鏈接代理?

[英]SQLAlchemy chaining association proxy for great grandchildren?

我有四個班級: GroupParentChildToy

  • Groupparents關系指向Parent
  • Parent有一個指向Childchildren關系
  • Childtoys關系指向Toy

Parent有一個toys association_proxy產生的所有Toy s表示的Parent的孩子們。

我希望能夠獲得一組中的所有玩具。 我試圖在Group上創建一個鏈接到Parenttoysassociation_proxy ,但它產生了這個:

[[<Toy 1>, <Toy 2>], [], [], []]

當我想要這個:

[<Toy 1>, <Toy 2>]

如果Parentchildren沒有任何Toy ,那么toys協會代理是[] 但是,第二個關聯代理不知道要排除空列表。 此外,列表應折疊。 反正有沒有讓這個工作?

class Group(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    created_at = db.Column(db.DateTime, default=utils.get_now_datetime)
    name = db.Column(db.String(80, convert_unicode=True))
    # relationships
    parents = db.relationship('Parent', backref='group')
    toys = association_proxy('parents', 'toys')

class Parent(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    group_id = db.Column(db.Integer, db.ForeignKey('group.id', ondelete='CASCADE'))
    created_at = db.Column(db.DateTime, default=utils.get_now_datetime)
    first_name = db.Column(db.String(80, convert_unicode=True))
    last_name = db.Column(db.String(80, convert_unicode=True))
    children = db.relationship('Child', backref='parent', cascade='all, delete')
    toys = association_proxy('children', 'toys')

class Child(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    parent_id = db.Column(db.Integer, db.ForeignKey('parent.id', ondelete='CASCADE'))
    created_at = db.Column(db.DateTime, default=utils.get_now_datetime)

class Toy(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    child_id = db.Column(db.Integer, db.ForeignKey('child.id', ondelete='CASCADE'))
    created_at = db.Column(db.DateTime, default=utils.get_now_datetime)
    child = db.relationship('Child', backref=db.backref("toys",cascade="all, delete-orphan", order_by="desc(Toy.id)"))

鑒於這些僅用於檢索和查看(正如您在評論中提到的,添加將是不明確的),我寧願做一個沒有 association_proxyviewonly關系:

class Group(db.Model):
    # ...
    toys = relationship('Toy',
        secondary="join(Group, Parent, Group.id == Parent.group_id).join(Child, Parent.id == Child.parent_id)",
        primaryjoin="and_(Group.id == Parent.group_id, Parent.id == Child.parent_id)",
        secondaryjoin="Child.id == Toy.child_id",
        viewonly=True,
    )

請注意,這是SQLAlchemy的一個新功能,並在文檔的Composite “Secondary” Joins部分中進行了描述。

然后你可以用它來查詢:

group_id = 123
group = session.query(Group).get(group_id)
print(group.toys)

或者您甚至可以使用它進行過濾,因此要查找包含名為“Super Mario”的玩具的組,您可以執行以下操作:

group = session.query(Group).filter(Group.toys.any(Toy.name == "Super Mario"))

但實際上,所有這些都可以通過簡單查詢來完成,或者創建一個啟用查詢的屬性。 請參閱文檔的“ 自定義列屬性”部分,您可以在其中使用任何簡單屬性column_propertyhybrid attribute

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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