Django:'QuerySet'对象在运行for循环时没有属性'product_obj'

f8rj6qna  于 2023-04-13  发布在  Go
关注(0)|答案(2)|浏览(153)

我试图通过一个查询集循环,获取产品对象,并从产品的库存量中删除订购的项目数量。
这是我的模特的样子

class CartOrderItem(models.Model):
    order = models.ForeignKey(CartOrder, on_delete=models.CASCADE)
    product_obj = models.ForeignKey(Product, on_delete=models.CASCADE)
    qty = models.IntegerField(default=0)
    ...
    date = models.DateTimeField(auto_now_add=True, null=True, blank=True)

这是它在管理部分的外观

这就是我运行forloop的方式

@login_required
def PaymentSuccessView(request):
    ...
    order_items = CartOrderItem.objects.filter(order=order, order__payment_status="paid")
    for o in order_items.product_obj:
        print(o.title)  # print all the products title
        print(o.stock_qty)  # print the stock qty from the Product model
        # I want to substract the CartOrderItem's qty from the Product's stock qty

然后它会显示这个错误

'QuerySet' object has no attribute 'product_obj'

这个错误是说CartOrderItems模型的查询集没有"product_obj"属性,但是我的CartOrderItems中显然有一个'product_obj'字段。
这是我想从产品库存数量中减去项目数量的方法,我不确定这是否有效,我也没有尝试过,因为上面的错误不允许我这样做。

for o in order_items.product_obj:
    o.product_obj.stock_qty -= o.qty
    o.save()
ruarlubt

ruarlubt1#

order_items是一个QuerySet对象,它显然没有product_obj属性。
你需要看看循环部分,因为你犯了一个很基本的错误。

order_items = CartOrderItem.objects.filter(order=order, order__payment_status="paid")
for order_item in order_items:
    order_item.product_obj.stock_qty -= o.qty
    order_item.product_obj.save()
d5vmydt9

d5vmydt92#

您需要首先迭代order_items以获得查询集结果,然后访问查询集返回的每个项的.product_obj属性。

order_items = CartOrderItem.objects.filter(order=order, order__payment_status="paid")
    for cart_order in order_items:
        product = cart_order.product_obj
        product.stock_qty -= cart_order.qty
        product.save()

相关问题