Django中外键能否设默认参数?设字符串默认值创建超级用户报错求助
Django ForeignKey默认值错误解决
错误原因
ForeignKey字段实际存储的是关联模型的主键(默认是id,整数类型),你给的默认值'personal'是字符串,类型不匹配,Django尝试把这个字符串当作主键id解析,就抛出了ValueError: Field 'id' expected a number but got 'personal'错误。
解决方法
你需要让默认值指向Genders模型中已存在的实例的主键,推荐用以下方式处理:
步骤1:定义获取默认gender的函数
在models.py中添加一个函数,自动创建或获取get_gender='personal'的记录,返回它的主键id:
def get_default_gender(): # 查找或创建get_gender为personal的记录 gender_obj, _ = Genders.objects.get_or_create(get_gender='personal') return gender_obj.id
步骤2:修改ForeignKey字段的默认值
把CustomUser中的gender字段默认值改成这个函数:
gender = models.ForeignKey(Genders, default=get_default_gender, on_delete=models.CASCADE)
步骤3:更新迁移并应用
在终端执行以下命令,更新数据库结构:
python manage.py makemigrations python manage.py migrate
这样设置后,创建超级用户时如果不指定gender,会自动关联到get_gender='personal'的Genders记录,不会再报错。另外,创建超级用户时,Django会提示你输入自定义字段的值,你也可以直接输入已存在的Genders记录的id来指定。
内容的提问来源于stack exchange,提问作者Nicolas_Darksoul
相关产品推荐
相关产品推荐

