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)
需删除的两处错误代码分别是:
objects = None:该行会覆盖Django模型默认的ORM查询管理器,导致所有模型查询操作失效- 自定义的
__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
相关产品推荐
相关产品推荐

