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

Django admin删除关联其他对象的模型实例时报错该如何修复?

Django删除Customer实例报错问题排查与修复

问题原因

你在Order模型类中错误重写了初始化方法,所有Order实例在实例化时都会被强制将主键id赋值为None,即便是从数据库查询得到的已有记录,也会丢失主键值。
Django执行实例删除操作时,需要通过实例主键计算哈希值完成关联校验,没有主键的实例无法完成哈希计算,因此抛出Model instances without primary key values are unhashable错误。
你删除Customer、User实例时触发该报错,是因为Django删除数据时会自动校验关联对象引用,即使你已经将Order的customer字段设为Null,查询关联Order实例的操作依然会触发实例化逻辑,导致主键丢失、哈希计算失败。

修复方案

  • 第一步:删除Order模型中错误的自定义逻辑,修改后Order模型如下:
class Order(models.Model):
    # many to one relationship: customer can have many orders
    customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, blank=True, null=True)
    date_order = models.DateTimeField(auto_now_add=True)
    complete = models.BooleanField(default=False, null=True, blank=False)
    transaction_id = models.CharField(max_length=200, null=True)

    def __str__(self):
        return str(self.id)

需删除的两处错误代码分别是:

  1. objects = None:该行会覆盖Django模型默认的ORM查询管理器,导致所有模型查询操作失效
  2. 自定义的__init__方法:该行强制清空实例主键,是本次报错的直接诱因
  • 第二步:执行模型迁移,同步修改到数据库:
python manage.py makemigrations
python manage.py migrate
  • 第三步:重新执行删除操作,此时不会再触发主键丢失导致的哈希错误。如果仍有异常,可先清空所有Order实例后再尝试删除:
# 进入Django shell执行
from yourapp.models import Order
Order.objects.all().delete()

内容的提问来源于stack exchange,提问作者code_rushh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 11:06:04