首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >尝试保存AbstractUser模型时Django出现错误

尝试保存AbstractUser模型时Django出现错误
EN

Stack Overflow用户
提问于 2021-07-27 02:45:20
回答 2查看 115关注 0票数 0

我想将此AbstractUser保存在我的模型中。

代码语言:javascript
运行
复制
#app_name members
#models.py
class User(AbstractUser):
        is_student = models.BooleanField(default=False)
        is_teacher = models.BooleanField(default=False)

settings.py

代码语言:javascript
运行
复制
INSTALLED_APPS = [
 #deful django app...
 #others app....
 'members',

]

AUTH_USER_MODEL = 'members.User'

在go makemigrations之前尝试保存时出现此错误

代码语言:javascript
运行
复制
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
auth.User.groups: (fields.E304) Reverse accessor for 'auth.User.groups' clashes with reverse accessor for 'members.User.groups'.        
        HINT: Add or change a related_name argument to the definition for 'auth.User.groups' or 'members.User.groups'.
auth.User.user_permissions: (fields.E304) Reverse accessor for 'auth.User.user_permissions' clashes with reverse accessor for 'members.User.user_permissions'.
        HINT: Add or change a related_name argument to the definition for 'auth.User.user_permissions' or 'members.User.user_permissions'.
members.User.groups: (fields.E304) Reverse accessor for 'members.User.groups' clashes with reverse accessor for 'auth.User.groups'.     
        HINT: Add or change a related_name argument to the definition for 'members.User.groups' or 'auth.User.groups'.
members.User.user_permissions: (fields.E304) Reverse accessor for 'members.User.user_permissions' clashes with reverse accessor for 'auth.User.user_permissions'.
        HINT: Add or change a related_name argument to the definition for 'members.User.user_permissions' or 'auth.User.user_permissions

为什么会出现这个错误?如何解决?

我也尝试了这个AUTH_USER_MODEL = 'myAppName.myClassName',得到了这个错误

代码语言:javascript
运行
复制
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
blog.Blog.author: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out.
        HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.
blog.BlogComment.user: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out.
        HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.
blog.GlobalNotifications.user: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out.
        HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.
notifications.Notifications.receiver: (fields.E301) Field defines a 
relation with the model 'auth.User', which has been swapped out.    
        HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.
notifications.Notifications.sender: (fields.E301) Field defines a relation with the model 'auth.User', which has been swapped out.      
        HINT: Update the relation to point at 'settings.AUTH_USER_MODEL'.
EN

Stack Overflow用户

发布于 2021-07-27 06:52:03

代码语言:javascript
运行
复制
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:

ERRORS:
auth.User.groups: (fields.E304) Reverse accessor for 'auth.User.groups' clashes with reverse accessor for 'members.User.groups'.        
        HINT: Add or change a related_name argument to the definition for 'auth.User.groups' or 'members.User.groups'.
auth.User.user_permissions: (fields.E304) Reverse accessor for 'auth.User.user_permissions' clashes with reverse accessor for 'members.User.user_permissions'.
        HINT: Add or change a related_name argument to the definition for 'auth.User.user_permissions' or 'members.User.user_permissions'.
members.User.groups: (fields.E304) Reverse accessor for 'members.User.groups' clashes with reverse accessor for 'auth.User.groups'.     
        HINT: Add or change a related_name argument to the definition for 'members.User.groups' or 'auth.User.groups'.
members.User.user_permissions: (fields.E304) Reverse accessor for 'members.User.user_permissions' clashes with reverse accessor for 'auth.User.user_permissions'.
        HINT: Add or change a related_name argument to the definition for 'members.User.user_permissions' or 'auth.User.user_permissions

基本上这个错误是说,你需要有唯一的related_name作为相关的名称,以确保字段之间没有冲突。它找不到settings.AUTH_USER_MODEL,因为您没有运行makemigrations

如果你想用is_student,is_teacher创建自定义用户,你可以遵循下面的代码,因为这就是我喜欢的创建自定义用户的方式

在测试之前,您需要运行makemigrations并进行迁移!或者,您可以创建单独的应用程序,以查看此自定义用户是否适合您的需求。

在utils.py中

代码语言:javascript
运行
复制
from django.db import models
import random
from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _


class IntegerRangeField(models.IntegerField):
    """ 
      This model handels :
          - Creating custom IntegerField with min/ max value.
          - Used in Users class, employee_number.
          - Gives each employee exactly 4 digits integer.
          - Can be edited in future if company grows in size.
        ...
        Attributes:
        ----------
        min_value :
            minimum number.
        max_value:
            maximum number.
        Methods:
        formfield(self, **kwargs):
          - create new defaults for IntegerField then update them.
    """
    def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
        self.min_value, self.max_value = min_value, max_value
        models.IntegerField.__init__(self, verbose_name, name, **kwargs)
    def formfield(self, **kwargs):
        defaults = {'min_value': self.min_value, 'max_value':self.max_value}
        defaults.update(kwargs)
        return super(IntegerRangeField, self).formfield(**defaults)

# generate random number from 1000, 9000

def create_new_employee_number():
    return random.randint(1000,9999)



class CustomUserManager(BaseUserManager):
    """
    Custom user model manager where username is unique identifiers
    able to add more fields to Django basic User model.
    """
    def create_student(self, username, password, **extra_fields):
        """
        Create and save a User with the given email and password.
        """
        if not username:
            raise ValueError(_('The username must be set'))
        user = self.model(username=username, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, username, password, **extra_fields):
        """
        Create and save a SuperUser with the given email and password.
        """
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)
        extra_fields.setdefault('is_student', False)
        extra_fields.setdefault('is_teacher', False)

        if extra_fields.get('is_staff') is not True:
            raise ValueError(_('Superuser must have is_staff=True.'))
        if extra_fields.get('is_superuser') is not True:
            raise ValueError(_('Superuser must have is_superuser=True.'))
        return self.create_user(username, password, **extra_fields)

    def create_teacher(self, username, first_name, last_name,  password=None):
        if not username:
            raise ValueError("User must have an email")
        if not password:
            raise ValueError("User must have a password")
        if not first_name:
            raise ValueError("User must have a first name")
        if not last_name:
            raise ValueError("User must have a last name")

        user = self.model(
            email=self.normalize_email(username)
        )
        user.first_name = first_name
        user.last_name = last_name
        user.set_password(password)  # change password to hash
        user.is_admin = False
        user.is_staff = True
        user.save(using=self._db)
        return user

    
    def create_staffuser(self, username, first_name, last_name,  password=None):
        if not username:
            raise ValueError("User must have an email")
        if not password:
            raise ValueError("User must have a password")
        if not first_name:
            raise ValueError("User must have a first name")
        if not last_name:
            raise ValueError("User must have a last name")

        user = self.model(
            email=self.normalize_email(username)
        )
        user.first_name = first_name
        user.last_name = last_name
        user.set_password(password)  # change password to hash
        user.is_admin = False
        user.is_staff = False
        user.is_teacher=True
        user.save(using=self._db)
        return user

现在在models.py中

代码语言:javascript
运行
复制
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.db.models.signals import post_save, pre_save
from django.utils.translation import ugettext_lazy as _
from django.core.exceptions import ValidationError
import datetime
from .utils import (
    IntegerRangeField,
    CustomUserManager,
    create_new_employee_number
) 
ROLES_CHOICES = (
    ('ST', 'Student'),
    ('TC', 'Teacher')
)


class User(AbstractUser):
    """
      This model handels :
              - follows django docs on how to customizing user mode.
              - https://docs.djangoproject.com/en/3.2/topics/auth/customizing/
              - Creating new users into the database.
              - aumatically genearte JWT from the home/urls.py "rest_auth.registration.urls"
        ...
        Attributes:
        ----------
        username :
            unique string field, max_length is 50
        name:
            user first and last name.
        role:
            user role two options(ST: Student, TC: Teacher)
        id:
            unique randomly generated integer, editable by admin.
            uses custom field, more details about IntegerRangeField in utils.py
        Methods:
        __str__
            return a string repr of the user, username.
    """
    username = models.CharField(unique=True, max_length=50)
    name = models.CharField(max_length=50, blank=True, default="Employee")
    role = models.CharField(
        max_length=50, choices=ROLES_CHOICES,
        blank=False, null=False, default="ST",
        error_messages = {'invalid': "Role is two choices ADMIN or EM"}
       )
    id= IntegerRangeField(
        min_value=1000, max_value=9999, editable=True, blank=True,
        unique=True, default=create_new_employee_number,
        error_messages={'invalid': "employee_number is unique integer 1000-9999"}
        )

    objects = CustomUserManager()

    def __str__(self):
        return self.username
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68535007

复制
相关文章

相似问题

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