【问题标题】:Django custom user model in admin, relation "auth_user" does not exist管理员中的 Django 自定义用户模型,关系“auth_user”不存在
【发布时间】:2013-06-01 22:37:28
【问题描述】:

我有一个自定义用户模型如下:

class User(AbstractUser):
    subscribe_newsletters = models.BooleanField(default=True)
    old_id = models.IntegerField(null=True, blank=True)
    old_source = models.CharField(max_length=25, null=True, blank=True)

并使用内置的 UserAdmin

admin.site.register(User, UserAdmin)

虽然编辑用户记录工作正常,但当我添加用户时,我收到以下错误

Exception Value: 
relation "auth_user" does not exist
LINE 1: ...user"."is_active", "auth_user"."date_joined" FROM "auth_user...

【问题讨论】:

    标签: django model


    【解决方案1】:

    经过一番挖掘,我发现了这个

    https://docs.djangoproject.com/en/1.5/topics/auth/customizing/#custom-users-and-the-built-in-auth-forms

    罪魁祸首是函数clean_username inside UserCreationForm inside django.contrib.auth.forms.py。已经创建了一些票证,但显然维护人员并不认为这是一个缺陷:

    https://code.djangoproject.com/ticket/20188

    https://code.djangoproject.com/ticket/20086

    def clean_username(self):
            # Since User.username is unique, this check is redundant,
            # but it sets a nicer error message than the ORM. See #13147.
            username = self.cleaned_data["username"]
            try:
                User._default_manager.get(username=username)
            except User.DoesNotExist:
                return username
            raise forms.ValidationError(self.error_messages['duplicate_username'])
    

    此文件中的User 直接引用内置用户模型。

    为了解决这个问题,我创建了自定义表单

    from models import User #you can use get_user_model
    from django.contrib.auth.forms import UserCreationForm
    from django.contrib.auth.admin import UserAdmin
    from django.contrib.auth import forms
    
    class MyUserCreationForm(UserCreationForm):
        def clean_username(self):
            # Since User.username is unique, this check is redundant,
            # but it sets a nicer error message than the ORM. See #13147.
            username = self.cleaned_data["username"]
            try:
                User._default_manager.get(username=username)
            except User.DoesNotExist:
                return username
            raise forms.ValidationError(self.error_messages['duplicate_username'])
    
        class Meta(UserCreationForm.Meta):
            model = User
    
    class MyUserAdmin(UserAdmin):  
        add_form = MyUserCreationForm   
    
    admin.site.register(User,MyUserAdmin)
    

    或者您可以尝试猴子修补原始 UserCreationForm 以替换 User 变量。

    【讨论】:

    • 不错的收获。考虑到 Django 文档实际上鼓励您在扩展 User 模型时立即使用这些类,这绝对应该得到解决。
    • 正是我正在寻找的解决方案。
    • 谢谢!只是一件小事,您的代码示例缺少导入:from django.contrib.auth import forms
    • 你带的第一个链接坏了
    【解决方案2】:

    Django 1.8

    如果您的应用尚未使用迁移,那么这也可能是问题所在,因为 contrib.auth 使用了迁移。为我的应用启用迁移为我解决了这个问题。

    $ ./manage.py makemigrations <my_app>
    $ ./manage.py migrate
    

    【讨论】:

    • 你拯救了我的理智。显然,如果你擦除迁移,你需要保留迁移文件夹和__init__.py,否则 Django 将无法创建初始迁移,随后会失败migrate
    【解决方案3】:

    这是由于迁移未运行。通过运行以下命令为我解决了这个问题:

    python manage.py syncdb
    
    【解决方案4】:

    首先迁移您的应用(具有自定义用户模型的应用),然后再迁移其余的:

    $ ./manage.py makemigrations <your_app>
    $ ./manage.py migrate
    $ ./manage.py makemigrations
    $ ./manage.py migrate
    

    您还可以控制迁移的顺序以确保自动发生,请参阅https://docs.djangoproject.com/en/1.10/howto/writing-migrations/#controlling-the-order-of-migrations

    【讨论】:

      【解决方案5】:

      我不得不:

      1. 删除数据库
      2. 创建一个新数据库
      3. 从所有模型中删除所有迁移
      4. 重新进行迁移
      5. 迁移

      这很烦人,因为我必须在本地和远程服务器上进行。我尝试只删除迁移或删除数据库,但随后 git 会推送/拉取旧迁移并将一切搞砸。

      附:最初出现此错误是因为我在将 AUTH_USER_MODEL = 'customauth.MyUser' 添加到不受版本控制的 settings.py 文件之前运行了迁移。

      【讨论】:

        【解决方案6】:

        您尚未在数据库中创建管理员。如果您使用的是最新版本的 Django

        试试:

        python manage.py makemigrations
        python manage.py migrate
        

        如果 auth 表不存在,我有点好奇如何获得登录名和密码?

        最后一条命令为我节省了很多时间

        【讨论】:

          猜你喜欢
          • 2013-06-01
          • 2014-07-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-07
          • 2013-06-26
          • 1970-01-01
          • 2012-11-19
          相关资源
          最近更新 更多