2

在搜索和尝试不同的事情之后,我似乎无法弄清楚我在这里做错了什么。我打算用一个服务对象填充 orderServicesFull,该对象填充了由 orderServices 的 serviceID 过滤的数据库数据。

我遇到的问题是我似乎找不到从 orderServices (第二行代码)中提取每个 serviceID 实例的正确语法。

orderServices = DBSession.query(ServicesByOrder).filter(ServicesByOrder.orderID == request.GET['orderID']).all()

orderServicesFull = DBSession.query(Services).filter(Services.serviceID == orderServices.serviceID).all()

错误:

AttributeError: 'list' object has no attribute 'serviceID'

我试过的:

在我试图解决这个问题时,我首先做了一些打印以了解正在传递的内容。我还查看了一些文档以尝试了解什么是合适的。我什至试过这个......哈哈

print("<---DEBUG--->")
    serviceIDs = []
    for i in range(0, len(orderServices)):
        serviceIDs.append(orderServices[i].serviceID)
        print(serviceIDs[i])

这背后的想法是它是一个简单的列表,我可以更轻松地使用它。我试图使用它而不是 orderServices 列表。你可以猜到这也不起作用。

任何想法或建议将不胜感激。

谢谢你的时间

!解决了!

好吧,经过一番折腾和更多的研究,我想出了一个解决方案。它可能没有其他人想出的那么有效,但它确实有效。

我的问题来自于我不知道列表中充满了对象。

orderServiceList = DBSession.execute(\
"SELECT s.serviceID, s.serviceName, s.serviceCost "+\
"FROM tblServicesByOrder AS so "+\
"INNER JOIN tblServices AS s "+\
"ON so.serviceID = s.serviceID "+\
"WHERE so.orderID = 1").fetchall()

orderServicesFull = [row for row in orderServiceList]

这样做允许我创建一个包含我需要的数据的字典列表,然后从那里填写我的 orderServicesFull。

我希望这可以帮助其他有同样问题或类似问题的人。

4

1 回答 1

1

从您的第一个代码片段中,该orderServices变量实际上是一个列表。因此,您不能 orderServices.ID在第二个查询中使用(您得到的错误解释了这一点)。
您应该能够使用以下ORM查询获取所有服务join

orderServicesFull = (DBSession.query(Services)
    .join(ServicesByOrder, Services.serviceID == ServicesByOrder.serviceID)
    .filter(ServicesByOrder.orderID == request.GET['orderID'])
    ).all()

Services如果您在and之间定义了(仅一个)关系ServicesByOrder,则连接不需要clause参数并变为.join(ServicesByOrder)

于 2013-04-26T08:26:46.433 回答