Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何建立两级多对多关系?_Python_Sql_Postgresql_Sqlalchemy_Flask Sqlalchemy - Fatal编程技术网

Python 如何建立两级多对多关系?

Python 如何建立两级多对多关系?,python,sql,postgresql,sqlalchemy,flask-sqlalchemy,Python,Sql,Postgresql,Sqlalchemy,Flask Sqlalchemy,我正在使用Flask SQLAlchemy在Flask中工作,并尝试建立多对多关系:客户可以有多个订单,订单也可以有多个客户(多对多);每个订单依次包含唯一项目的列表(一对多) 我按照SQLAlchemy文档为多对多关系设置了一个关联表,并为一对多关系使用了普通关系/外键;所有引用都设置为lazy='dynamic' association_table = Table('association', Base.metadata, Column('left_id', Integer, Foreign

我正在使用Flask SQLAlchemy在Flask中工作,并尝试建立多对多关系:客户可以有多个订单,订单也可以有多个客户(多对多);每个订单依次包含唯一项目的列表(一对多)

我按照SQLAlchemy文档为多对多关系设置了一个关联表,并为一对多关系使用了普通关系/外键;所有引用都设置为
lazy='dynamic'

association_table = Table('association', Base.metadata,
Column('left_id', Integer, ForeignKey('left.id')),
Column('right_id', Integer, ForeignKey('right.id'))
)
检索与客户机关联的所有
项目的有效方法是什么?我假设
[order.items.all()中的item for item for order.client.orders]
会起作用(减少上述问题),但有没有更有效的方法?如果结果需要排序怎么办


更新

我现在知道了通过以下两种方法检索客户订单项的两种方法(第一种来自Audrius的答案):


我相信它们都能提供相同的结果,但为了提高效率,应该选择哪一个呢

在SQL中直接编写查询时,您将使用连接高效地检索所需的数据(如Rachcha在回答中所示)。这同样适用于炼金术。有关更多示例,请参阅上的SA文档

如果您的模型定义如下(使用Flask SQLAlchemy,因为您用标签标记了问题):

clients\u orders=db.Table('clients\u orders',
db.Column('client_id',db.Integer,db.ForeignKey('client.id'),
主键=真),
db.Column('order\u id',db.Integer,db.ForeignKey('order.id'),
主(主键=真)
)
类客户端(db.Model):
id=db.Column(db.Integer,主键=True)
订单=数据库关系('Order',secondary=clients\u orders,
backref='clients')
#定义其他列。。。
类顺序(db.Model):
id=db.Column(db.Integer,主键=True)
#定义其他列。。。
类别项(数据库模型):
id=db.Column(db.Integer,主键=True)
order_id=db.Column(db.Integer,db.ForeignKey('order.id'),nullable=False)
order=db.relationship('order',backref='items')
timestamp=db.Column(db.DateTime)
#定义其他列。。。
那么您的查询可能如下所示:

db.session.query(项)\
加入(订单)。加入(订单。客户)\
筛选器(Client.id==42)\
订购人(项目时间戳)

谢谢!是的,我正在使用炼金术,我的模式设置与您的答案几乎相同。我想知道您的查询是否应该优先于
Item.query.filter(Item.order\u id.\u in(client.order\u id)).order\u by(Item.timestamp)
,其中order\u id是通过关联代理实现的。我猜你的过滤逻辑更简单,效率更高。是这样吗?您的查询要求您已经有了
客户机
以及与之相关的所有
订单
对象。所以这至少是一个不需要的附加查询,除非您的代码逻辑需要它。您也很难向其添加更复杂的过滤条件。关于速度,判断哪一个更快的最好方法是使用
EXPLAIN ANALYZE
和真实数据尝试SA查询呈现的SQL代码。
db.session.query(Item).\
    join(Order).join(Order.clients).\
    filter(Client.id == 42).\
    order_by(Item.timestamp)
Item.query.filter(Item.order_id._in(client.order_ids)).order_by(Item.timestamp)‌​