所以,我有一些应该通过产品列表的代码,将它们与价格联系起来,然后在网页上向用户显示价格作为“显示项目”的产品
for product in product_list:
p = PricedProduct.objects.filter(proid=product)
p.order_by('date')
dp = DisplayProduct
dp.proid = product.id
dp.proname = product.productname
print(product.productname)
dp.proprice = p[0].value
displaylist.insert(0,dp)
这是我将项目链接到'print'方法当前显示的价格的地方:
苹果
香蕉
然而,当我跑:
for dp in displaylist:
print(dp.proname)
它显示:
香蕉
香蕉
任何人都可以告诉我为什么会这样,因为它导致我的网页只显示2个香蕉而不是苹果和香蕉
答案 0 :(得分:2)
您不初始化DisplayProduct
,您只需将dp
设置为引用到DisplayProduct
类,因此,您可以直接更改类的字段:
for product in product_list:
p = PricedProduct.objects.filter(proid=product)
p.order_by('date')
dp = DisplayProduct() # construct a new DisplayProduct
dp.proid = product.id
dp.proname = product.productname
print(product.productname)
dp.proprice = p[0].value
displaylist.insert(0,dp)
请注意,此代码效率很低:通过在顶部插入,您可以构建时间复杂度为 O(n 2 )的算法。在列表末尾附加通常更有效(因为它已摊销成本 O(1))。如果您需要反转列表,最好在结束时反转。
我还建议为DisplayProduct
构建一个合适的初始化器(也许你的类已经有了一个合适的initialzier),这样我们就可以将它重写为:
for product in product_list:
p = PricedProduct.objects.filter(proid=product)
p.order_by('date')
# might require some changes to the __init__ of DisplayProduct
dp = DisplayProduct(
proid=product.id,
proname=product.productname,
proprice=p[0].value
)
print(product.productname)
# appending is more efficient than prepending
displaylist.append(dp)