列表填充异常:循环中DisplayProduct赋值后重复显示同一内容
问题原因与解决方案
Hey,这个问题我之前帮朋友排查过,典型的类与实例混淆的坑!
核心问题
你看这段代码:
dp = DisplayProduct dp.proid = product.id dp.proname = product.productname
这里的dp = DisplayProduct并没有创建DisplayProduct的新对象,只是把类本身赋值给了dp变量。换句话说,你每次循环都是在修改同一个类的静态属性,而不是为每个产品生成独立的实例。最后一次循环处理Banana时,它的属性值会完全覆盖之前Apple的赋值——毕竟你从头到尾都在操作同一个“全局”的类,所以displaylist里存的全是这个类的引用,自然输出和网页展示全是Banana。
修复代码
只需要给DisplayProduct加上括号,每次循环创建一个新的实例就搞定了:
for product in product_list: # 优化:链式调用order_by,确保查询集是排序后的结果 p = PricedProduct.objects.filter(proid=product).order_by('date') # 关键:创建新的DisplayProduct实例! dp = DisplayProduct() dp.proid = product.id dp.proname = product.productname print(product.productname) dp.proprice = p[0].value displaylist.insert(0, dp)
额外小提醒
原来的p.order_by('date')其实不会修改原查询集(Django的QuerySet是惰性的,链式调用才会生成新的查询集),所以我把它改成了链式写法,这样才能确保你拿到的是按date排序后的PricedProduct数据。
内容的提问来源于stack exchange,提问作者Reece Hewitson
相关产品推荐
相关产品推荐

