首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django用户模型AttributeError:'str‘对象没有属性’object‘

Django用户模型AttributeError:'str‘对象没有属性’object‘
EN

Stack Overflow用户
提问于 2020-12-07 15:34:47
回答 1查看 1.5K关注 0票数 0

我使用django作为项目的后端,但是每当我对我的用户模型执行查询时,我都会得到错误AttributeError: 'str' object has no attribute 'objects'

但只有当我从设置导入用户模型时,才会发生此错误。

代码语言:javascript
复制
from django.conf import settings
User = settings.AUTH_USER_MODEL

但不是来自from django.contrib.auth.models import User

Settings.py

代码语言:javascript
复制
AUTH_USER_MODEL = 'users.User'

用户的Models.py

代码语言:javascript
复制
from django.db import models
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
from django.db.models.signals import post_save
from django.dispatch import receiver
from django.conf import settings
from rest_framework.authtoken.models import Token


class UserManager(BaseUserManager):
    def create_user(self, email,username, password, phone, **extra_fields):
        if not email:
            raise ValueError("Email Address Is Needed")
        if not username:
            raise ValueError("Username Must Be Provided")

        email = self.normalize_email(email)
        user = self.model(
            email=email,
            username=username,
            phone=phone
        )
        user.set_password(password)
        user.is_active = False
        user.save()

    def create_superuser(self, email,username, password,phone):
        email = self.normalize_email(email)
        user = self.model(
            email=email,
            username=username,
            phone=phone
        )
        user.set_password(password)
        user.is_active = True
        user.is_admin = True
        user.save()


class User (AbstractBaseUser):
    username = models.CharField(max_length=254,blank=False,null=False,unique=True)
    email = models.EmailField(
        unique=True, max_length=254, blank=False, null=False)
    phone = models.CharField(max_length=250,blank=False,null=False,unique=True)
    is_active = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    objects = UserManager()

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

    def get_full_name(self):
        return f"{self.first_name} {self.last_name}"

    def __str__(self):
        return self.email

    def has_perm(self, perm, obj=None):
        "Does the user have a specific permission?"
        # Simplest possible answer: Yes, always
        return True

    def has_module_perms(self, app_label):
        "Does the user have permissions to view the app `app_label`?"
        # Simplest possible answer: Yes, always
        return True

    @property
    def is_staff(self):
        "Is the user a member of staff?"
        # Simplest possible answer: All admins are staff
        return self.is_admin

Views.py

代码语言:javascript
复制
User = settings.AUTH_USER_MODEL
response = {}
class RegisterUserView(APIView):
    def post(self,request,**kwargs):
        username = self.request.POST['username']
        email = self.request.POST['email']
        phone = self.request.POST['phone']
        password = self.request.POST['password']
        password2 = self.request.POST['password2']

        if username:
            if User.objects.filter(username=username).exists():
                response['message'] = "Username Already Exists"
                return Response(response)

        if email:
            if User.objects.filter(email=email).exists():
                response['message'] = 'Email Already Exists'
                return Response(response)
        if phone:
            if User.objects.filter(phone=phone).exists():
                response['message'] = 'Phone Number Already Exists'
                return Response(response)
        if password and password2:
            if password != password2:
                response['message'] = 'Password Does Not Match'
                return Response(response)

        if "".strip() in (username,email,password,password2,phone):
            response['message'] = 'Some Credentials Were Invalid'
            return Response(response)

        # user = User.objects.create(username=username,email=email,phone=phone,password=password2)
        # user.save()
        response['status'] = 'Created'
        return Response(response)

全误差回溯

代码语言:javascript
复制
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python3/dist-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "/home/freduah/.local/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/home/freduah/.local/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/home/freduah/.local/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/home/freduah/.local/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/home/freduah/VideoCallDesign/learning/learningDatabase/users/views.py", line 47, in post
    if User.objects.filter(username=username).exists():
AttributeError: 'str' object has no attribute 'objects'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-07 15:37:34

井,

代码语言:javascript
复制
AUTH_USER_MODEL = 'users.User'

的确是一根绳子。

所以当你说

但只有当我从设置导入用户模型时,才会发生此错误。

您不正确,因为您没有以这种方式导入User模型。

使用get_user_model代替,它使用此AUTH_USER_MODEL返回User模型。如果您想了解它是如何发生的,请看来源

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65184671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档