Django:访问模型实例
Django: access model instances
我有一个模型叫做 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
相关。所以以下就足够了,它是数据库上的单个查询:
Order.objects.filter(id=4).update(complete=True)
我有一个模型叫做 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
相关。所以以下就足够了,它是数据库上的单个查询:
Order.objects.filter(id=4).update(complete=True)