在搜索并尝试不同的事情后,我似乎无法弄清楚我在这里做错了什么。我打算发生的事情是使用一个Services对象填充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。
我希望这有助于其他人遇到同样的问题或类似问题。
答案 0 :(得分:1)
从您的第一个代码段开始,orderServices
变量实际上是一个列表。因此,您无法在第二个查询中使用orderServices.ID
(您得到的错误解释了这一点)
您应该能够使用ORM
join
查询获取所有服务
orderServicesFull = (DBSession.query(Services)
.join(ServicesByOrder, Services.serviceID == ServicesByOrder.serviceID)
.filter(ServicesByOrder.orderID == request.GET['orderID'])
).all()
如果您在Services
和ServicesByOrder
之间定义了(仅一个)关系,则该联接不需要clause
参数,并且变为.join(ServicesByOrder)
< / em>的