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

数据库存在用户但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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 17:15:34