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

Django simple_history报错:__init__()缺少必填参数'on_delete'

解决Django 2.2中simple_history运行makemigrations时的on_delete缺失错误

这个问题的核心原因是Django 2.0及以上版本要求所有外键字段必须显式指定on_delete参数,而你当前安装的django-simple-history版本可能过于老旧,没有适配这个Django的变更,导致内部的CurrentUserField(本质是外键)初始化时缺少了这个必填参数。

下面是几种靠谱的解决方法,按优先级排序:

1. 优先升级到兼容Django 2.2的simple_history版本

直接修改第三方包的源码是不推荐的(后续包更新会覆盖你的修改,也不利于维护),最稳妥的方式是升级到适配Django 2.2的版本:

pip install --upgrade django-simple-history

通常来说,django-simple-history >= 2.8.0版本已经完全支持Django 2.x系列,升级后这个on_delete的错误应该会自动消失。

2. 自定义字段替代原CurrentUserField(无法升级时的备选)

如果因为项目依赖限制无法升级包,可以在自己的项目代码中定义一个修补后的CurrentUserField,避免修改第三方库:

from django.conf import settings
from django.db import models
from simple_history.models import CurrentUserField as BaseCurrentUserField

class FixedCurrentUserField(BaseCurrentUserField):
    def __init__(self, **kwargs):
        # 自动添加on_delete参数,默认用CASCADE,你也可以改成其他选项比如PROTECT
        kwargs.setdefault("on_delete", models.CASCADE)
        super().__init__(settings.AUTH_USER_MODEL, null=True, **kwargs)

之后在需要使用CurrentUserField的地方,改用这个自定义的FixedCurrentUserField即可。

3. 注册历史模型时显式指定history_user字段

另一种方式是在注册模型到simple_history时,手动定义history_user字段并补上on_delete参数:

from django.db import models
from django.conf import settings
from simple_history import register
from simple_history.models import HistoricalRecords

@register
class YourModel(models.Model):
    # 你的模型字段定义...
    name = models.CharField(max_length=100)
    
    # 手动指定历史记录的用户字段,补上on_delete
    history = HistoricalRecords(
        history_user_field=models.ForeignKey(
            settings.AUTH_USER_MODEL,
            on_delete=models.CASCADE,
            null=True,
            related_name="%(app_label)s_%(class)s_history"
        )
    )

你之前遇到的其他问题很大概率也是版本不兼容导致的,建议先尝试升级django-simple-history,这应该能解决大部分适配问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:33:13