Django运行makemigrations报gettext()意外关键字参数'null'错误
错误定位
报错TypeError: gettext() got an unexpected keyword argument 'null'的触发点在models.py的Plan模型定义,和Task模型、序列化器、视图代码无关。
你在写date字段时出现了括号错位:把本该传给models.DateField的null=False、blank=False两个参数,写到了翻译函数_()(即gettext)的调用括号内部。gettext仅接收待翻译的字符串参数,不识别null这类关键字参数,模型扫描阶段执行到这行代码就会直接抛出类型错误。
错误代码片段:
# 错误写法:null、blank参数被错误包裹在_()的括号内 date = models.DateField(verbose_name=_("Date"), help_text=_("Enter the date that you want to plan", null=False, blank=False))
修复方案
- 第一步:修正括号位置,将字段参数移回
models.DateField的参数列表中,修正后的代码如下:
date = models.DateField( verbose_name=_("Date"), help_text=_("Enter the date that you want to plan"), null=False, blank=False )
- 第二步:修复视图中模型保存的逻辑错误。你当前写的
data.user = request.user是给序列化器实例绑定属性,不会写入模型数据,保存时会触发user字段非空报错,修正视图的post方法逻辑:
def post(self, request): serializer = CreateTaskSerializer(data=request.data) if serializer.is_valid(): # 通过save方法传入外键字段值,不需要手动给序列化器加属性 serializer.save(user=request.user) return Response({ "message": _("You've just created your task") }, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
- 额外优化建议:不要在models.py顶层直接调用
get_user_model()获取用户模型,容易引发循环导入问题,将两个模型的user外键关联值改为settings.AUTH_USER_MODEL即可:
# 删掉文件顶部的 User = get_user_model() 写法 # 外键修改示例 user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="utask", verbose_name=_("User") )
验证
修正括号错位问题后,重新执行python manage.py makemigrations即可正常生成迁移文件,不会再触发gettext相关的参数错误。
内容的提问来源于stack exchange,提问作者NimAwk
相关产品推荐
相关产品推荐

