Django中关联user_auth_model的1对多外键如何设置默认值
错误原因
ForeignKey字段在数据库中实际存储的是关联用户表的主键值(通常为整数类型),你设置的默认值'admin'是字符串,Django尝试将字符串转为整数时触发类型错误。- 你的需求是默认取用户名为
admin的用户主键,不能直接将用户名作为ForeignKey的默认值。
解决方法
首先定义可调用的默认值函数,再将函数绑定到字段的default参数即可:
from django.db import models from django.conf import settings from django.contrib.auth import get_user_model def get_default_admin_id(): User = get_user_model() # 先查找用户名为admin的超管 admin = User.objects.filter(username="admin", is_superuser=True).first() if not admin: # 兜底逻辑:找不到admin用户时取第一个超管,可根据业务调整 admin = User.objects.filter(is_superuser=True).first() # 返回用户主键,而非用户对象或用户名 return admin.pk class department(models.Model): dept_id = models.AutoField(primary_key=True) dept_name = models.CharField(max_length=100) adid = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING, null=False, default=get_default_admin_id # 注意仅传函数名,不要加括号执行 ) def __str__(self): return self.dept_name
注意事项
- 禁止给
default参数的函数加括号,否则Django生成迁移文件时会直接执行函数将值写死,后续admin用户变更后默认值不会自动更新。 - 请确保项目中至少存在1个超级用户,否则兜底逻辑也找不到用户时会抛出异常,你可以根据业务调整兜底逻辑,比如允许字段为
null时可以返回None。 - 若你的用户表主键为非整数类型(如UUID),上述逻辑也通用,只要返回对应类型的主键值即可。
内容的提问来源于stack exchange,提问作者piyush
相关产品推荐
相关产品推荐

