Django中OrderCompleteStatus的save方法报RelatedObjectDoesNotExist错误如何解决
错误产生原因
- 核心原因是你访问
OrderItem实例的反向一对一关联orderitemcompletestatus时,对应的OrderItemCompleteStatus实例不存在。OrderItem和OrderItemCompleteStatus是一对一关联关系,但你没有做实例自动同步逻辑,OrderItem创建后不会自动生成对应的OrderItemCompleteStatus记录,直接访问未创建的反向一对一关联就会抛出RelatedObjectDoesNotExist错误。 - 额外潜在风险:你
OrderCompleteStatus的order字段设置了on_delete=models.SET_NULL, null=True,如果关联的订单被删除,self.order会变成None,后续访问order.orderitem_set也会抛出属性错误。
解决方法
- 优先给
OrderItem加自动创建关联OrderItemCompleteStatus的逻辑,可以通过重写OrderItem的save方法实现,保证每个OrderItem都有对应的状态记录:
class OrderItem(models.Model): # 原有字段保持不变 def save(self, *args, **kwargs): is_new = self.pk is None super().save(*args, **kwargs) if is_new: # 新建OrderItem时自动创建对应的状态记录 OrderItemCompleteStatus.objects.get_or_create(order_item=self)
- 修改
OrderCompleteStatus的save方法,增加边界判断和不存在时的创建逻辑,避免报错:
def save(self, *args, **kwargs): super().save(*args, **kwargs) # 先判断关联订单是否存在 if not self.order: return if self.warehouse and self.pickup and self.delivered : self.order.complete = True self.order.save(update_fields=['complete']) if self.pickup : orderitems = self.order.orderitem_set.all() for item in orderitems: # 用get_or_create避免关联实例不存在的问题 item_status, created = OrderItemCompleteStatus.objects.get_or_create(order_item=item) item_status.pickup = True item_status.save(update_fields=['pickup'])
- 可选性能优化:如果你不需要保留历史状态记录,也可以直接用update方法批量更新,不用循环遍历,执行效率更高:
if self.pickup and self.order: OrderItemCompleteStatus.objects.filter( order_item__order=self.order ).update(pickup=True)
内容的提问来源于stack exchange,提问作者Manas Man Singh
相关产品推荐
相关产品推荐

