列表未正确填写

时间:2018-05-26 12:09:39

标签: python django list

所以,我有一些应该通过产品列表的代码,将它们与价格联系起来,然后在网页上向用户显示价格作为“显示项目”的产品

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个香蕉而不是苹果和香蕉

1 个答案:

答案 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)