数据库存在用户但Django QuerySet返回空列表问题排查
问题描述
我正在开发一个管理员仪表盘,支持管理员创建用户、列出用户及按ID搜索用户。目前用户可成功创建并存储到数据库,但发起GET请求列出用户或搜索用户时,返回结果为空列表,且无报错信息。
我的Model类
class MyAccountManager(BaseUserManager): def create_user(self,email,username,first_name,last_name, age, password=None): if not email: raise ValueError("Users must have email address") if not username: raise ValueError("Users must have username") user = self.model( email=self.normalize_email(email), username=username, first_name=first_name, last_name=last_name, age=age, ) user.set_password(password) user.save(using=self._db) return user def create_superuser(self,username,email,first_name,last_name,age,password): user = self.create_user( email=self.normalize_email(email), username=username, first_name=first_name, last_name=last_name, age=age,) user.is_admin = True user.is_staff = True user.is_superuser = True user.save(using=self._db) return user class User(AbstractBaseUser): email = models.EmailField(verbose_name="email",max_length=60,unique=True) username = models.CharField(max_length=30,unique=True) date_joined = models.DateTimeField(verbose_name='date joined',auto_now_add=True) last_login = models.DateTimeField(verbose_name='last login',auto_now=True) is_admin = models.BooleanField(default=False) is_active = models.BooleanField(default=False) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) first_name = models.CharField (max_length=60) last_name = models.CharField(max_length=60) age = models.DateField(default=datetime.date.today) profile_pic = models.ImageField(upload_to='image',blank=True,null=True) USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username','first_name','last_name','age'] objects = MyAccountManager() def __str__(self): return self.username + "," +self.email def has_perm(self, perm, obj=None): return self.is_admin def has_module_perms(self, app_label): return True
我的Serializer类
class UserSerializer (serializers.ModelSerializer): class Meta: model = User fields = ['username','first_name','last_name','email','age','is_active'] read_only_fields = ('email',) #fields = '__all__'
我的View类
class UserList(generics.ListCreateAPIView): serializer_class = UserSerializer queryset = User.objects.all() permission_classes = [permissions.IsAdminUser] #authentication_classes = [authentication.TokenAuthentication] def list(self,request): queryset = self.get_queryset() serializer = UserSerializer(queryset, many=True) return Response(serializer.data)
问题原因与解决方法
1. 未配置自定义用户模型(核心原因)
如果项目settings.py中未指定AUTH_USER_MODEL,Django会默认使用内置的auth.User模型,而非你定义的自定义User模型。这会导致你创建的用户存储在自定义表中,但视图查询的是默认空表,返回空列表。
解决:
在settings.py中添加配置,替换your_app_name为你的应用名称(比如模型所在的accounts应用):
AUTH_USER_MODEL = 'your_app_name.User'
2. 用户默认is_active为False
你的User模型中is_active默认值是False,创建普通用户和超级用户时均未主动设置为True:
- 普通用户无法被正常查询(部分场景下会被认证系统过滤)
- 超级用户若
is_active为False,可能无法通过认证,导致视图返回空结果
解决:
- 修改
create_user方法,创建普通用户时默认激活:
def create_user(self,email,username,first_name,last_name, age, password=None): if not email: raise ValueError("Users must have email address") if not username: raise ValueError("Users must have username") user = self.model( email=self.normalize_email(email), username=username, first_name=first_name, last_name=last_name, age=age, is_active=True # 添加此行 ) user.set_password(password) user.save(using=self._db) return user
- 修改
create_superuser方法,确保超级用户激活:
def create_superuser(self,username,email,first_name,last_name,age,password): user = self.create_user( email=self.normalize_email(email), username=username, first_name=first_name, last_name=last_name, age=age,) user.is_admin = True user.is_staff = True user.is_superuser = True user.is_active = True # 添加此行 user.save(using=self._db) return user
- 对已创建的用户,通过Django Shell批量激活:
from your_app_name.models import User User.objects.update(is_active=True)
3. 冗余代码清理
你重写的list方法完全重复了ListCreateAPIView的默认实现,可以直接删除,不影响功能。
内容的提问来源于stack exchange,提问作者Hassaan Alraee
相关产品推荐
相关产品推荐

