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
相关产品推荐
相关产品推荐

