【问题标题】:django.db.utils.IntegrityError: duplicate key value violates unique constraint "core_user_pkey" DETAIL: Key (id)=(23) already existsdjango.db.utils.IntegrityError:重复键值违反唯一约束“core_user_pkey”详细信息:键(id)=(23)已经存在
【发布时间】:2019-09-06 12:21:02
【问题描述】:

我正在使用 python 3.7、django 2.2.4、docker 和 postgresql 进行项目,当我想创建超级用户时出现此错误 我做了 23 次(这就是为什么 id 等于 23)。

这是我的模型:

class UserManager(BaseUserManager):

    def create_user(self, email, username, name, password=None):
        """ create and save new user"""
        if not email:
            raise ValueError('User must have an email address')
        user = self.model(email=self.normalize_email(email),
                          name=name,
                          username=username)
        user.set_password(password)
        user.save(using=self._db)

        return user

    def create_superuser(self, email, username, name, password):
        """create and save new super user"""
        user = self.create_user(email, username, name, password)
        user.is_staff = True
        user.is_superuser = True

        user.save(self._db)

        return user


class User(AbstractBaseUser, PermissionsMixin):
    """custom user model that using username in username field"""
    email = models.EmailField(max_length=70, unique=True)
    username = models.CharField(max_length=50, unique=True)
    name = models.CharField(max_length=50)
    gender = models.PositiveIntegerField(validators= 
    [MaxValueValidator(3)], 
    null=True)
    # 1 for men 2 for woman 0 for not mention
    bio = models.TextField(null=True)
    lives_in = models.CharField(max_length=70, null=True)
    phone_number = models.PositiveIntegerField(validators= 
    [MaxValueValidator(99999999999)], null=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    objects = UserManager()

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

这是我的迁移代码:

class Migration(migrations.Migration):

    initial = True

    dependencies = [
        ('auth', '0011_update_proxy_permissions'),
    ]

    operations = [
        migrations.CreateModel(
            name='User',
            fields=[
                ('id', models.AutoField(auto_created=True,     
            primary_key=True, serialize=False, verbose_name='ID')),
                ('password', models.CharField(max_length=128, 
            verbose_name='password')),
                ('last_login', models.DateTimeField(blank=True, null=True, 
            verbose_name='last login')),
                ('is_superuser', models.BooleanField(default=False, 
            help_text='Designates that this user has all permissions 
            without explicitly assigning them.', verbose_name='superuser 
            status')),
            ('email', models.EmailField(max_length=70, unique=True)),
            ('username', models.CharField(max_length=50, unique=True)),
            ('name', models.CharField(max_length=50)),
            ('gender', models.PositiveIntegerField(null=True, validators=    
            [django.core.validators.MaxValueValidator(3)])),
            ('bio', models.TextField(null=True)),
            ('lives_in', models.CharField(max_length=70, null=True)),
            ('phone_number', models.PositiveIntegerField(null=True, 
            validators= 
            [django.core.validators.MaxValueValidator(99999999999)])),
            ('is_active', models.BooleanField(default=True)),
            ('is_staff', models.BooleanField(default=False)),
            ('groups', models.ManyToManyField(blank=True, help_text='The 
            groups this user belongs to. A user will get all permissions 
            granted to each of their groups.', related_name='user_set', 
            related_query_name='user', to='auth.Group', 
            verbose_name='groups')),
            ('user_permissions', models.ManyToManyField(blank=True, 
            help_text='Specific permissions for this user.', 
            related_name='user_set', related_query_name='user', 
            to='auth.Permission', verbose_name='user permissions')),
            ],
            options={
                'abstract': False,
            },
        ),
    ]

这是我的管理员代码:

class UserAdmin(BaseUserAdmin):
    ordering = ['id']
    list_display = ['email', 'name']
    list_filter = ('is_active', 'is_superuser')
    fieldsets = (
        (None, {'fields': ('username', 'email', 'password')}),
        (_('Personal Info'), {'fields': ('name',)}),
        (
            _('Permissions'),
            {'fields': ('is_active', 'is_staff', 'is_superuser')}
        ),
        (_('Important dates'), {'fields': ('last_login',)})
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('username', 'name', 'email', 'password1',   
        'password2')
        }),
    )

 admin.site.register(models.User, UserAdmin)

通过打印数据库编号 23(此时)中的对象计数显示在屏幕上,但是当我想创建另一个超级用户时,会发生相同的错误,并且此时再次打印对象计数,编号 24 显示在屏幕上,这意味着该对象已添加到数据库,但是当我进入管理页面并输入我的用户并传递错误时,屏幕上出现并说该用户不存在。

创建超级用户时出现完全错误:

 Traceback (most recent call last):
   File "/usr/local/lib/python3.7/site-          
 packages/django/db/backends/utils.py", line 84, in _execute
     return self.cursor.execute(sql, params)
   psycopg2.errors.UniqueViolation: duplicate key value violates unique           
 constraint "core_user_pkey"
 DETAIL:  Key (id)=(23) already exists.


 The above exception was the direct cause of the following exception:

 Traceback (most recent call last):
 File "manage.py", line 21, in <module>
   main()
 File "manage.py", line 17, in main
   execute_from_command_line(sys.argv)
 File "/usr/local/lib/python3.7/site- 
 packages/django/core/management/__init__.py", line 381, in                                              
 execute_from_command_line
    utility.execute()
 File "/usr/local/lib/python3.7/site- 
 packages/django/core/management/__init__.py", line 375, in execute
     self.fetch_command(subcommand).run_from_argv(self.argv)
   File "/usr/local/lib/python3.7/site- 
 packages/django/core/management/base.py", line 323, in run_from_argv
     self.execute(*args, **cmd_options)
   File "/usr/local/lib/python3.7/site- 
 packages/django/contrib/auth/management/commands/createsuperuser.py", 
 line 61, in execute
     return super().execute(*args, **options)
   File "/usr/local/lib/python3.7/site- 
 packages/django/core/management/base.py", line 364, in execute
     output = self.handle(*args, **options)
   File "/usr/local/lib/python3.7/site- 
 packages/django/contrib/auth/management/commands/createsuperuser.py", 
 line 156, in handle


 self.UserModel._default_manager.db_manager(database).create_superuser 
 (**user_data)
   File "/app/core/models.py", line 27, in create_superuser
     user.save(self._db)
   File "/usr/local/lib/python3.7/site- 
 packages/django/contrib/auth/base_user.py", line 66, in save
     super().save(*args, **kwargs)
   File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py",      
 line 741, in save
     force_update=force_update, update_fields=update_fields)
   File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py", 
 line 779, in save_base
     force_update, using, update_fields,
   File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py", 
 line 870, in _save_table
     result = self._do_insert(cls._base_manager, using, fields, update_pk, 
     raw)
   File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py", 
 line 908, in _do_insert
     using=using, raw=raw)
   File "/usr/local/lib/python3.7/site- 
 packages/django/db/models/manager.py", line 82, in manager_method
     return getattr(self.get_queryset(), name)(*args, **kwargs)
   File "/usr/local/lib/python3.7/site- 
 packages/django/db/models/query.py", line 1186, in _insert
     return query.get_compiler(using=using).execute_sql(return_id)
   File "/usr/local/lib/python3.7/site- 
 packages/django/db/models/sql/compiler.py", line 1335, in execute_sql
     cursor.execute(sql, params)
   File "/usr/local/lib/python3.7/site- 
 packages/django/db/backends/utils.py", line 99, in execute
     return super().execute(sql, params)
   File "/usr/local/lib/python3.7/site- 
 packages/django/db/backends/utils.py", line 67, in execute
     return self._execute_with_wrappers(sql, params, many=False, 
 executor=self._execute)
   File "/usr/local/lib/python3.7/site- 
 packages/django/db/backends/utils.py", line 76, in _execute_with_wrappers
     return executor(sql, params, many, context)
   File "/usr/local/lib/python3.7/site- 
 packages/django/db/backends/utils.py", line 84, in _execute
     return self.cursor.execute(sql, params)
   File "/usr/local/lib/python3.7/site-packages/django/db/utils.py", line 
 89, in __exit__
     raise dj_exc_value.with_traceback(traceback) from exc_value
   File "/usr/local/lib/python3.7/site- 
 packages/django/db/backends/utils.py", line 84, in _execute
     return self.cursor.execute(sql, params)
 django.db.utils.IntegrityError: duplicate key value violates unique 
 constraint "core_user_pkey"
 DETAIL:  Key (id)=(23) already exists.

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    如错误所示,超级用户可能已经存在,您应该删除所有超级用户并创建一个新用户。如果无法访问数据库库,可以运行命令:

    python manage.py flush
    

    小心,这个命令会清理整个数据库。 然后迁移数据库:

    python manage.py makemigrations
    python manage.py migrate
    

    然后你可以尝试再次创建超级用户

    python manage.py createsuperuser
    

    【讨论】:

      【解决方案2】:

      在您的create_superuser 方法中,对用户的保存调用缺少参数using

          def create_superuser(self, email, username, name, password):
              """create and save new super user"""
              user = self.create_user(email, username, name, password)
              user.is_staff = True
              user.is_superuser = True
      
              user.save(using=self._db). # <- DON'T FORGET TO ADD "USING"
      
              return user
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-07
        • 1970-01-01
        • 2018-03-11
        • 2019-07-22
        • 2018-03-28
        • 2013-10-08
        相关资源
        最近更新 更多