Python sqlalchemy访问父类属性
看看这篇文章的底部,你可以看到我有三门课。这里的代码是动态编写的未经测试的伪代码,但它充分显示了我的问题。如果我们需要实际的课程,我可以在明天上班时更新这个问题。因此,忽略语法问题和只代表一种思想的代码,而不是我在这里描述的实际“代码” 问题1 如果您查看itemsearch类方法,您可以看到,当用户执行搜索时,我称之为对基类的搜索,然后根据该结果返回正确的类/对象。这是可行的,但似乎有些笨拙。有更好的方法吗 问题2 如果您查看KitItem类,您可以看到我覆盖了标价。如果标志calc_list设置为true,那么我将对组件的标价求和,并将其作为套件的标价返回。如果它没有标记为真,我想返回“基本”标价。然而,据我所知,无法访问父属性,因为在正常设置中,它将毫无意义,但使用sqlalchemy和共享表继承,它可能会很有用 短暂性脑缺血发作Python sqlalchemy访问父类属性,python,oop,sqlalchemy,Python,Oop,Sqlalchemy,看看这篇文章的底部,你可以看到我有三门课。这里的代码是动态编写的未经测试的伪代码,但它充分显示了我的问题。如果我们需要实际的课程,我可以在明天上班时更新这个问题。因此,忽略语法问题和只代表一种思想的代码,而不是我在这里描述的实际“代码” 问题1 如果您查看itemsearch类方法,您可以看到,当用户执行搜索时,我称之为对基类的搜索,然后根据该结果返回正确的类/对象。这是可行的,但似乎有些笨拙。有更好的方法吗 问题2 如果您查看KitItem类,您可以看到我覆盖了标价。如果标志calc_list
Answer-1:事实上,您不需要在这里做任何特殊的事情:假设您正确地配置了继承层次结构,您的查询将为每一行返回正确的类(
Item
或KitItem
)。这就是ORM部分的优点。不过,您可以将查询配置为立即加载属于项
子项的附加列(从您的代码中,这只是计算列表
列),您可以通过指定的多态('*')
:
请在中阅读更多关于此的信息。要查看差异,请启用SQL日志记录,并将有无
的测试脚本与多态(…)
进行比较-您可能需要执行更少的SQL
语句
答案-2:我不会用一个纯计算的条目覆盖一个属性化条目。相反,我只需要创建另一个计算属性(我们称之为final\u price
),对于两个类中的每一类,该属性如下所示:
class Item(Base):
...
@property
def total_price(self):
return self.list_price
class KitItem(Item):
...
@property
def total_price(self):
if self.calc_list:
_price = 0.0
for comp in self.components:
_price += comp.component.list_price * comp.qty
return _price
else:
# @note: again, you do not need to perform any query here at all, as *self* is that you need
return self.list_price
同样在这种情况下,您可能会考虑将关系
KitItem.components
配置为立即加载,以便总价的计算不会触发额外的SQL。但是您必须自己决定这是否有利于您的用例(同样,分析场景中生成的SQL)。谢谢您的回答非常有用。当您说分析生成的SQL时,有一个问题是您的意思是打印并阅读语句以确保它符合我的要求,还是您正在使用工具来帮助您进行分析?只需通过在引擎配置()中设置#echo=True来启用SQL语句日志记录
@classmethod
def search(cls):
item = DBSession.query(cls).with_polymorphic('*').filter(...) #do search stuff here
return item
class Item(Base):
...
@property
def total_price(self):
return self.list_price
class KitItem(Item):
...
@property
def total_price(self):
if self.calc_list:
_price = 0.0
for comp in self.components:
_price += comp.component.list_price * comp.qty
return _price
else:
# @note: again, you do not need to perform any query here at all, as *self* is that you need
return self.list_price