我有一个名为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)