Django模型创建指向User的必填外键字段,以下代码写法是否正确?
问题结论
你写的这段代码完全不正确,无法正常运行,也不符合“必填外键”的需求,问题和修正方案如下:
核心问题点
- 外键字段的
default=''参数完全错误:外键存储的是关联User表的主键值,默认是整数类型,你给的空字符串和字段预期的数据类型不匹配,执行模型迁移的时候会直接抛出类型错误。 - 你需要的是必填外键,Django的
ForeignKey默认就是null=False, blank=False,本身就要求创建实例时必须传入该字段的值,不需要额外加默认值,加default反而破坏了必填的约束逻辑。
正确写法
常规场景(新模型,无历史数据)
直接去掉错误的default参数即可:
created_by = models.ForeignKey(User, on_delete=models.CASCADE)
更规范的写法是引用配置中的用户模型,避免后续自定义用户模型时出现兼容问题:
from django.db import models from django.conf import settings # 模型内的字段定义 created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
特殊场景(给已有数据的旧表加该字段)
如果是在已经有数据的模型上新增这个字段,直接加必填字段会导致迁移失败,需要先临时允许为空,补完所有旧数据的created_by值之后再改回必填:
- 第一次修改字段,执行迁移:
created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
- 手动或者写脚本把所有旧数据的
created_by字段赋值完成后,去掉null=True,再次执行迁移即可。
内容的提问来源于stack exchange,提问作者J maria
相关产品推荐
相关产品推荐

