我正在寻找动态查询对象的属性。我不知道在这种情况下我将在执行时使用哪个属性或列。
class Product(Base):
__tablename__ = 'products'
sku = Column(String, primary_key=True)
list_price = Column(String)
status = Column(String)
url = Column(String)
special_price1 = Column(String)
special_price2 = Column(String)
special_price3 = Column(String)
Run Code Online (Sandbox Code Playgroud)
我有一个 SQLAlchemy 基类Product,它描述了一些属性,以及与标价不同的其他特殊价格。
然后我PriceList在下面有一个类,它可以访问其他资源和方法,这些资源和方法有助于报告和更新表中的'products'列。此类存储有关所有Product对象的唯一特价清单的信息。
class PriceList:
def __init__(self, name, db_col_name):
# Display name
self.name = name
# Used for querying the database for a specific column
# This will always be one of the 4 price related column names
# list_price, special_price1, special_price2, or special_price3
self.db_col_name = db_col_name
Run Code Online (Sandbox Code Playgroud)
后来我开始迭代每个Product和PriceList实例。
for product in products:
for price_list in price_lists:
# Do stuff
Run Code Online (Sandbox Code Playgroud)
在这一点上,我的product对象有一个新的特价,或多个新的特价,我计划在数据库中更新。我可以简单地将我的对象添加到数据库会话并提交,但我需要在提交之前获取旧价格并将它们链接到各自的价目表。旧价格用于稍后通过电子邮件发送给我的报告中。我现在正在做的是下面
for product in products:
sku = product.sku
for price_list in price_lists:
# New price
new_price = product.__getattribute__(price_list.db_col_name)
# Get the existing special price from the database
old_price = s.query(Product.__getattribute__(Product, price_list.db_col_name)).filter(Product.sku.like(sku)).first()
Run Code Online (Sandbox Code Playgroud)
我觉得我通过使用 __getattribute__() 把这个问题复杂化了。它有效,但这似乎不是pythonic。有没有人知道在更新之前获取未知列值的更好方法?数据库更新每大约 500 个产品只发生一次或两次,因此在处理它们时将每个特殊价格存储在外部变量中并不完全有效。
要动态访问属性,您应该使用getattr内置函数。
new_price = getattr(product, price_list.db_col_name)
Run Code Online (Sandbox Code Playgroud)
如果实例过时,则应使用Session.expire,这意味着下次访问属性时,将从数据库中检索它们。
s.expire(product)
# or only expire price
s.expire(product, [price_list.db_col_name])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3763 次 |
| 最近记录: |