You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 13:54:03