You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:35:31