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

Django集成MongoDB时无法打开User模型记录的问题求助

Django + MongoDB 下Admin打开User模型报错的解决办法

问题根源

你遇到的问题是因为Django自带的AbstractUser主键用的是AutoField(整数类型),但MongoDB的主键是ObjectId,两者不匹配,导致Admin查询User记录时触发了MongoDB不支持的exact查找规则,其他模型正常是因为它们可能已经配置了兼容MongoDB的主键。

解决步骤

1. 修改User模型,替换主键类型

放弃继承AbstractUser,改用AbstractBaseUser+PermissionsMixin,手动定义ObjectId类型的主键,示例代码:

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin
from djongo import models
from bson.objectid import ObjectId

class UserManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('必须填写邮箱')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields['is_staff'] = True
        extra_fields['is_superuser'] = True
        return self.create_user(email, password, **extra_fields)

class User(AbstractBaseUser, PermissionsMixin):
    _id = models.ObjectIdField(primary_key=True, default=ObjectId)
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=150, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']

    objects = UserManager()

2. 配置Admin适配自定义User模型

在admin.py里注册你的自定义User模型,调整Admin的字段显示和配置:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User

class CustomUserAdmin(UserAdmin):
    list_display = ('email', 'username', 'is_staff', 'is_active')
    list_filter = ('is_staff', 'is_active')
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('个人信息', {'fields': ('username',)}),
        ('权限设置', {'fields': ('is_staff', 'is_active', 'is_superuser')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'username', 'password1', 'password2', 'is_staff', 'is_active')}
        ),
    )
    search_fields = ('email', 'username')
    ordering = ('email',)

admin.site.register(User, CustomUserAdmin)

3. 执行迁移

  • 先备份现有MongoDB中的用户数据(避免丢失)
  • 运行以下命令完成模型更新:
python manage.py makemigrations
python manage.py migrate

额外检查

  • 确认你用的MongoDB适配库(比如djongo)和当前Django版本是兼容的
  • 对比其他正常模型的主键配置,确保User模型的主键规则和它们一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:55:18