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

使用自定义User模型时出现Account DoesNotExist错误排查

问题分析与解决方案

问题背景

我在group/models.py中定义了Group模型:

class Group(models.Model):
   leader = models.ForeignKey(User, on_delete=models.CASCADE)
   name = models.CharField(max_length=55)
   description = models.TextField()
   joined = models.ManyToManyField(User, blank=True)

在users/models.py中定义了与Django标准User一对一关联的Account模型:

class Account(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    joined_groups = models.ManyToManyField(Group, related_name='joined_group')
    created_groups = models.ManyToManyField(Group)

users/admin.py的配置如下:

class AccountInline(admin.StackedInline):
    model = Account
    can_delete = False
    verbose_name_plural = 'Accounts'

class CustomUserAdmin(UserAdmin):
    inlines = (AccountInline,)

admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)

遇到的问题:

  • 新建User后,对应的Account并未实际创建,后台新用户页面中Account显示为Account: #1
  • 尝试让该用户加入或创建Group时,触发DoesNotExist - Account matching query does not exist错误
  • 管理员用户的Account显示为Account: Account object (6),手动将新用户添加到Group并保存后,Account变为Account: Account object (7),此时用户可正常操作Group

问题根源

核心原因是Django的OneToOneField不会自动为新创建的User生成对应的Account实例。后台显示的Account: #1只是Admin inline组件的占位标识,数据库中并没有实际的Account记录。只有当你在后台手动修改Account相关的关联字段(比如通过Group的关联操作触发)时,Django才会被动创建缺失的Account对象,但这无法满足新用户直接使用Group功能的需求。

该问题和Account模型定义、Django原生User模型本身无关,只是缺少了User创建时自动创建Account的触发逻辑。

解决方法

方法1:使用Django信号自动创建Account

在users/models.py中添加post_save信号,当User创建完成后自动生成对应的Account:

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.contrib.auth.models import User

@receiver(post_save, sender=User)
def create_user_account(sender, instance, created, **kwargs):
    if created:
        Account.objects.create(user=instance)

@receiver(post_save, sender=User)
def save_user_account(sender, instance, **kwargs):
    instance.account.save()

方法2:修改Admin配置,强制创建Account

在AccountInline中添加extra=1,确保新建User时Admin会自动渲染可保存的Account表单,保存User时同步创建Account:

class AccountInline(admin.StackedInline):
    model = Account
    can_delete = False
    verbose_name_plural = 'Accounts'
    extra = 1  # 添加该行配置

方法3:在用户注册视图中手动创建Account

如果使用自定义用户注册视图,在创建User对象后,手动生成对应的Account:

def register(request):
    if request.method == 'POST':
        # 处理表单数据并创建User
        user = User.objects.create_user(username=..., password=...)
        # 手动创建关联的Account
        Account.objects.create(user=user)
        # 后续注册逻辑
    # ...

验证

完成上述任意一种配置后,新建User时会自动生成对应的Account实例,后台会显示Account: Account object (ID),用户无需手动操作即可直接加入或创建Group。

内容的提问来源于stack exchange,提问作者Yehuda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 10:54:34