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.

如何解决此问题?

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

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()
orderID = OrderItem.objects.filter(order_id=4)

在这里,您选择与id为4的Order相关的所有OrderItem实例。然后在所有OrderItem对象上循环,并尝试在与每个OrderItem关联的顺序上设置一个标志complete=True

但是构造查询时,所有OrderItem实例都将与同一个Order相关。因此,以下内容就足够了,而且它是对DB的单个查询:

Order.objects.filter(id=4).update(complete=True)

最新更新