django.db.utils.Ошибка целостности: (1062, «Дублирующая запись » для ключа ‘username'»)

#python #django

#python #джанго #django

Вопрос:

У меня есть следующая реализация пользовательской модели пользователя в моем приложении Django :

users/models.py

 class UserManager(BaseUserManager):
    use_in_migrations = True

    def _create_user(self, email: str,
                     password: str, is_staff: bool,
                     is_superuser: bool, **extra_fields):
        """Creates and saves a User with the given email and password.
        """
        email = self.normalize_email(email)
        user = self.model(email=email, is_staff=is_staff, is_active=True,
                          is_superuser=is_superuser, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, email: str, password=None, **extra_fields):
        return self._create_user(email, password, False, False, **extra_fields)

    def create_superuser(self, email: str, password: str, **extra_fields):
        return self._create_user(email, password, True, True, **extra_fields)


class User(AbstractUser, UUIDModel):
    first_name = models.CharField(max_length=30, blank=True)
    last_name = models.CharField(max_length=30, blank=True)
    email = models.EmailField(unique=True, db_index=True)
    is_staff = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    date_joined = models.DateTimeField(default=timezone.now)

    USERNAME_FIELD = 'email'
    objects = UserManager()

    class Meta:
        verbose_name = 'user'
        verbose_name_plural = 'users'
        ordering = ('-date_joined', )

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

    def get_short_name(self):
        return self.first_name

    def get_email(self):
        return self.email

    def __str__(self):
        return "{}".format(self.email)
  

И моя форма изменения в admin.py выглядит так :

 from django.contrib import admin
from django.contrib.auth.admin import UserAdmin as AuthUserAdmin
from django.contrib.auth.forms import UserChangeForm as DjangoUserChangeForm
from django.contrib.auth.forms import UserCreationForm as DjangoUserCreationForm

from .models import User


# Forms
# ----------------------------------------------------------------------------
class MyUserCreationForm(DjangoUserCreationForm):
    class Meta:
        model = User
        fields = ("email",)


class MyUserChangeForm(DjangoUserChangeForm):
    class Meta:
        model = User
        fields = '__all__'


# ModelAdmins
# ----------------------------------------------------------------------------
@admin.register(User)
class UserAdmin(AuthUserAdmin):
    add_form_template = 'admin/auth/user/add_form.html'
    model = User
    fieldsets = (
        (None, {'fields': ('email', 'password')}),
        ('Personal info', {'fields': ('first_name', 'last_name',)}),
        ('Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser',
                                    'groups', 'user_permissions')}),
        ('Important dates', {'fields': ('last_login', 'date_joined')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password1', 'password2'),
        }),
    )
    readonly_fields = ('date_joined', 'last_login')
    form = MyUserChangeForm
    add_form = MyUserCreationForm
    list_display = ('email', 'first_name', 'last_name', 'is_active')
    list_filter = ('is_superuser', 'is_active')
    search_fields = ('first_name', 'last_name', 'email')
    ordering = ('email',)
  

Я добавил эти две строки в свои settings.py файлы.

 AUTH_USER_MODEL = 'users.User'
AUTHENTICATION_BACKENDS = (
    "django.contrib.auth.backends.ModelBackend",)
  

Я расширил эту модель до пользовательской модели профиля. Но когда я пытаюсь создать другого пользователя , я получаю следующую ошибку django.db.utils.IntegrityError: (1062, "Duplicate entry '' for key 'username'") . Кто-нибудь может мне помочь с этим?

Я использую Django: Django==2.2 с MySQL.

Ответ №1:

Установить

 USERNAME_FIELD = 'username'
  

и протестируйте свой код.

Если все работает, то измените это.

Комментарии:

1. Попытался использовать то же самое: USERNAME_FIELD = ‘username’, но снова получил ту же ошибку. Напротив, в моей User модели мне пришлось установить username = None и каким-то образом это сработало! Ссылка : fomfus.com/articles/… Поверьте мне, это первый раз, когда я столкнулся с такого рода ошибкой, несмотря на то, что все делал правильно

Ответ №2:

Добавьте username поле в свой пользовательский пользовательский режим

Поскольку в ошибке четко указано дублирующая запись для имени пользователя ключа, что означает, что вы переопределили аутентификацию пользователя по умолчанию по идентификатору электронной почты, поэтому каждый раз, когда вы создаете blank имя пользователя, оно пытается быть созданным. Тем не менее, Django не разрешает использовать реализацию по умолчанию unique=True , поэтому вам также необходимо переопределить атрибут username.

 class User(AbstractUser):
    email = models.EmailField(max_length=100, unique=True)
    # add the below one line code
    username = models.CharField(max_length=100, unique=False, null=True, default=None)
    is_deleted = models.BooleanField(default=False)
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']