Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 sqlalchemy访问父类属性_Python_Oop_Sqlalchemy - Fatal编程技术网

Python sqlalchemy访问父类属性

Python sqlalchemy访问父类属性,python,oop,sqlalchemy,Python,Oop,Sqlalchemy,看看这篇文章的底部,你可以看到我有三门课。这里的代码是动态编写的未经测试的伪代码,但它充分显示了我的问题。如果我们需要实际的课程,我可以在明天上班时更新这个问题。因此,忽略语法问题和只代表一种思想的代码,而不是我在这里描述的实际“代码” 问题1 如果您查看itemsearch类方法,您可以看到,当用户执行搜索时,我称之为对基类的搜索,然后根据该结果返回正确的类/对象。这是可行的,但似乎有些笨拙。有更好的方法吗 问题2 如果您查看KitItem类,您可以看到我覆盖了标价。如果标志calc_list

看看这篇文章的底部,你可以看到我有三门课。这里的代码是动态编写的未经测试的伪代码,但它充分显示了我的问题。如果我们需要实际的课程,我可以在明天上班时更新这个问题。因此,忽略语法问题和只代表一种思想的代码,而不是我在这里描述的实际“代码”

问题1 如果您查看itemsearch类方法,您可以看到,当用户执行搜索时,我称之为对基类的搜索,然后根据该结果返回正确的类/对象。这是可行的,但似乎有些笨拙。有更好的方法吗

问题2 如果您查看KitItem类,您可以看到我覆盖了标价。如果标志calc_list设置为true,那么我将对组件的标价求和,并将其作为套件的标价返回。如果它没有标记为真,我想返回“基本”标价。然而,据我所知,无法访问父属性,因为在正常设置中,它将毫无意义,但使用sqlalchemy和共享表继承,它可能会很有用

短暂性脑缺血发作


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