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
相关产品推荐
相关产品推荐

