首页 > 解决方案 > Django:访问模型实例

问题描述

我有一个模型叫OrderItem

class OrderItem(models.Model):
    customer = models.ForeignKey(
        User, on_delete=models.SET_NULL, blank=True, null=True)
    product = models.ForeignKey(
        Product, on_delete=models.SET_NULL, blank=True, null=True)
    order = models.ForeignKey(
        Order, on_delete=models.SET_NULL, blank=True, null=True)
    quantity = models.IntegerField(default=0, null=True, blank=True)
    date_added = models.DateTimeField(auto_now_add=True)

和一个名为Order

class Order(models.Model):
    customer = models.ForeignKey(
        User, on_delete=models.SET_NULL, blank=True, null=True)
    date_ordered = models.DateTimeField(auto_now_add=True)
    complete = models.BooleanField(default=False, null=True, blank=False)
    transaction_id = models.CharField(max_length=200, null=True)

现在views.py我有一个OrderItem 模型 order实例。在我的Order 模型中,我需要将其order实例设置为完成。我正在尝试如下操作:

orderID = OrderItem.objects.filter(order_id=4)
#lets say there are more than one order_id with the value of 4
for order in orderID:
    order = Order.objects.get(id=orderID)
    order.complete=True
    order.save()

这段代码给了我:

ValueError: The QuerySet value for an exact lookup must be limited to one result using slicing.

如何解决这个问题?

标签: pythondjangodjango-modelsdjango-queryset

解决方案


orderID在您的示例中可以是列表,其大小可能大于一。这使得以下操作失败:

orderID=OrderItem.objects.filter(order_id=4)
#lets say there are more than one order_id with the value of 4
for order in orderID:
       order = Order.objects.get(id=orderID)  # FAIL: list passed as ID
       order.complete=True
       order.save()

您应该order作为参数传递给.get()函数或使用相关模型,例如

order_items=OrderItem.objects.filter(order_id=4)
for order_item in order_items:
       order = order_item.order
       order.complete=True
       order.save()

推荐阅读