扩展Django用户模型和错误

3

django 1.8.2

this is my model:

class AppUser(AbstractUser):
    _SEX = (
        ('M', 'Male'),
        ('F', 'Female'),
    )
    _pregex  = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
    phone    = models.CharField(validators=[_pregex], max_length=16, blank=True)
    gender   = models.CharField(max_length=1, blank=True, choices=_SEX)
    birthday = models.DateField(blank=True)
    vericode = models.CharField(max_length=40, blank=True) # verification code over SMS?
    verified = models.DateTimeField(null=True) # datetime stored when verification happened

    @property
    def age(self):
        today = date.today()
        return today.year - self.birthday.year - ((today.month, today.day) < (self.birthday.month, self.birthday.day))

这是我的设置:

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# register externals
EXTERNAL_LIBS_PATH = os.path.join(BASE_DIR, "_externals", "libs")
EXTERNAL_APPS_PATH = os.path.join(BASE_DIR, "_externals", "apps")
APPS_PATH = os.path.join(BASE_DIR, "apps")
sys.path = ["", EXTERNAL_APPS_PATH, EXTERNAL_LIBS_PATH, APPS_PATH] + sys.path

# TEST PATH
TEST_ASSETS = os.path.join(BASE_DIR, "_test")

# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

# Application definition
INSTALLED_APPS = (
    'suit',
    'django.contrib.auth',
    'django.contrib.admin',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.postgres',
    'cacheops',
    'rest_framework',
    'rest_framework.authtoken',
    'corsheaders',
    'djoser',
    'consents'
)

# Custom model for Auth
# AUTH_USER_MODEL = 'consents.AppUser'

我的文件夹结构如下

app
  -settings.py etc
apps
  -consents

在settings.py中,我添加了应用程序路径:APPS_PATH = os.path.join(BASE_DIR,“apps”)到sys.path,
当我运行python manage.py syncdb(或其他任何内容)时,我会得到这个错误:
(cmr) F:\_Projects\cmr\containers\backend>python manage.py syncdb
F:\_Projects\cmr\.venv\cmr\lib\importlib\_bootstrap.py:321: RemovedInDjango19Warning: django.contrib.contenttypes.generic is deprecated and will be removed in Django 1.9. Its contents have been moved to the fields, forms, and admin submodules of django.contrib.contenttypes.
  return f(*args, **kwds)

SystemCheckError: System check identified some issues:

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

如果我在设置中取消注释这一行
# AUTH_USER_MODEL = 'consents.AppUser'

我遇到了另一个错误:
ValueError: Dependency on unknown app: consents

我只需要向默认的用户模型添加几个字段(不想创建一个全新的auth类来继承AbstractBaseUser)

那么我做错了什么?


是的,这是更快的方法。我不会改变身份验证,只是向用户模型添加字段。我不喜欢“profile”解决方案,因为我需要与djoser包集成。 - DmitrySemenov
好的,你应该取消settings.py中的注释,告诉Django使用你的自定义用户,这就是触发巨大错误的原因。现在让我们处理另一个问题... 问题是你有两个基于同一抽象模型的具体模型,并且外键或多对多字段在它们的“related_name”中冲突。 - Lorenzo Peña
尝试:AUTH_USER_MODEL = 'apps.consents.AppUser' - Lorenzo Peña
嗯,如果你想把你的应用程序放在一个名为 apps 的子模块中,你只需要像这样引用应用程序:apps.consents,包括 INSTALLED_APPS 在内的所有地方。我不建议以那种方式更改 path,只需使用相对于项目根目录的绝对导入即可。我自己将我的应用程序放在一个名为 apps 的子模块中,但是我需要将它们称为 apps.myappname.modelsapps.myotherappname.views 等等... - Lorenzo Peña
问题在于这里 AUTH_USER_MODEL = 'apps.consents.AppUser' - Django 不允许这种情况发生(会出现 ValueError)。 - DmitrySemenov
显示剩余3条评论
1个回答

2

解决方案

  1. 将数据库删除并重新创建。
  2. 删除*.pyc文件。
  3. 删除迁移文件夹。

然后运行python manage.py makemigrations就可以完美地工作了。


我也遇到了同样的问题。我一直在想这可能是解决方案。很高兴它对你有用,现在我也要尝试去做。 - user2918461
1
这对我也很有效。 - Destiny Franks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接