Django报错Item matching query does not exist的问题修复求助
解决保存Item时创建ItemTransactionLog抛出DoesNotExist错误的问题
你遇到的错误核心原因是:在新增Item时,你先尝试从数据库查询该Item,再执行保存操作。此时Item还未写入数据库,Item.objects.get(cl_itemid=self.cl_itemid)自然找不到对应记录,抛出DoesNotExist异常。
修复方案1:先保存Item,再创建日志(基础版)
调整代码顺序,先调用父类的save方法将Item写入数据库,再创建交易日志。同时直接使用当前实例self代替数据库查询,既高效又避免查询错误:
def save(self, *args, **kwargs): # 先将Item保存到数据库 super(Item, self).save(*args, **kwargs) # 直接使用当前实例self关联日志,无需额外查询 ItemTransactionLog.objects.create( cl_itemid=self, trans_desc='Add Clearance Item', trans_recorded=timezone.now() )
修复方案2:区分新增/更新日志(进阶版)
如果需要针对新增和更新操作生成不同的日志描述,可以通过self.pk是否存在来判断(新增对象的pk为None,已存在对象的pk有值):
def save(self, *args, **kwargs): # 判断当前是新增还是更新操作 is_new_item = self.pk is None # 先保存Item到数据库 super(Item, self).save(*args, **kwargs) # 根据操作类型设置日志描述 trans_desc = 'Add Clearance Item' if is_new_item else 'Update Clearance Item' # 创建交易日志 ItemTransactionLog.objects.create( cl_itemid=self, trans_desc=trans_desc, trans_recorded=timezone.now() )
关键说明
- 新增对象时,必须先执行
super().save(),确保对象被写入数据库后,才能保证关联的日志能正确关联到该Item - 直接使用
self作为外键值,比执行Item.objects.get()更高效,且不会出现查询不到的问题 - 若
ItemTransactionLog的cl_itemid字段是外键,直接传入Item实例是Django外键关联的标准用法
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

