我正在尝试创建一个动态函数,动态添加属性以便在jinja模板中轻松访问值。
此代码正常运行,但它是静态的。
# Used to display a cart summary of items that have been pledged.
products_in_cart = Cart.query.filter(Cart.campaign_id == campaign_id).all()
# total_cart_quantity(products_in_cart, "quantity", "quantity_total")
for item in products_in_cart:
item.quantity_total = 0 #Adding the attribute quantity_total
for item_loop2 in products_in_cart:
if item.user_id == item_loop2.user_id:
item.quantity_total = item.quantity_total + item_loop2.quantity
# Remove duplicate objects based on user_id attribute.
new_set = set()
new_list = []
for obj in products_in_cart:
if obj.user_id not in new_set:
new_list.append(obj)
new_set.add(obj.user_id)
products_in_cart = new_list
我想根据传递给函数的参数使添加的属性名称动态化,以便我可以在其他地方使用。点符号不起作用,因为我需要一个变量来命名属性。 obj [variable_attrbute]错误。 setattr()什么都不做。
def total_cart_quantity(cart_objects, sum_attribute, new_attribute):
'''
From cart get the total of a particular quantity and add it to a new attribute.
cart_objects = the queried cart_objects.
sum_attribute = the attribute to be summed.
new_attribute = the string of the new attribute name
'''
for item in cart_objects:
# Two different attempts to add an attribute.
# setattr will just not add the attribute
setattr(item, sum_attribute, new_attribute) # this will do nothing
# item[new_attribute] = 0 # this will error
for item_loop2 in cart_objects:
if item.user_id == item_loop2.user_id:
item[new_attribute] = item[new_attribute] + item_loop2[sum_attribute]
# Remove duplicate objects based on user_id attribute.
new_set = set()
new_list = []
for obj in cart_objects:
if obj.user_id not in new_set:
new_list.append(obj)
new_set.add(obj.user_id)
products_in_cart = new_list
return products_in_cart
如何动态添加属性名称和值?
答案 0 :(得分:2)
您以错误的方式使用getattr
和setattr
。实际签名如下:
variable = object.field ~ variable = getattr(object, 'field' [, default])
object.field = value ~ setattr(object, 'field', value)
答案 1 :(得分:0)
你也可以使用属性装饰器来做这样的事情。例如:
class CartItem(Base):
cart_id = Column(ForeignKey("cart.id", primary_key=True)
item_id = Column(ForeignKey("item.id", primary_key=True)
class Cart(Base):
id = Column(Integer, primary_key=True)
items = relationship("CartItems")
@property
def number_of_items(self):
return len(self.items) #or whatever logic you need here