You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

列表填充异常:循环中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:55:26