Django.db.utils.IntegrityError: UNIQUE constraint failed: users_user.username

Я пытаюсь создать пользовательскую модель пользователя и создать нового простого пользователя через панель администратора, но у меня не получается, пожалуйста, проверьте мой код

Вот мой файл models.py:

from django.db import models
from django.contrib.auth.models import AbstractUser, PermissionsMixin
from .managers import UserManager


class User(AbstractUser, PermissionsMixin):
    # Personal information fields
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=255)

    # Permissions and status fields
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    # Important dates fields
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        return self.name

Вот мой файл managers.py:

class CustomUserManager(UserManager):
    def create_user(self, email, password, **extra_fields):
        user = self.model(email=email, password=password, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        extra_fields.setdefault("is_active", True)

        if extra_fields.get("is_staff") is not True:
            raise ValueError(_("Super User must be staffed"))
        if extra_fields.get("is_superuser") is not True:
            raise ValueError(_("Super User must be staffed"))

        return self.create_user(email, password, **extra_fields)

и вот мой файл admin.py:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User


class CustomUserAdmin(UserAdmin):
    model = User
    list_display = ("email", "is_active", "is_staff", "is_superuser")
    list_filter = ('is_active', 'is_staff', 'is_superuser')
    search_fields = ('name', "email")

    # Editing field sets
    fieldsets = (
        ("Personal", {"fields": ("email", "password")}),
        ("Permissions", {"fields": ("is_active", "is_staff", "is_superuser")}),
    )
    # Add a new user fieldsets
    add_fieldsets = (
        ("Personal", {"fields": ("email", "password1", "password2")}),
        ("Permissions", {"fields": ("is_active", "is_staff", "is_superuser")}),
    )


admin.site.register(User, CustomUserAdmin)

Я попытался создать нового пользователя через панель администратора, но получил эту ошибку django.db.utils.IntegrityError: UNIQUE constraint failed: users_user.username

Во-первых, вы создали "CustomUserManager", но используете "UserManager", а также вам не нужно наследоваться от "PermissionsMixin". Вот Django AbstractUser:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    """
    An abstract base class implementing a fully featured User model with
    admin-compliant permissions.

    Username and password are required. Other fields are optional.
    """

    username_validator = UnicodeUsernameValidator()

    username = models.CharField(
        _("username"),
        max_length=150,
        unique=True,
        help_text=_(
            "Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only."
    ),
        validators=[username_validator],
        error_messages={
            "unique": _("A user with that username already exists."),
         },
    )

Согласно этому, вы не можете оставить имя пользователя пустым. Вот быстрое решение:

class User(AbstractUser):
    """User"""

    def save(self, *args, **kwargs):
        self.username = self.email
        super().save(*args, **kwargs)

Если вы не хотите использовать поле username вообще, удалите его из модели User, добавив username = None. Вот обновленный код.

class User(AbstractUser):
    # Remove username field from User model
    username = None

    # Personal information fields
    email = models.EmailField(unique=True)
    name = models.CharField(max_length=255)

    # Permissions and status fields
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)

    # Important dates fields
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = CustomUserManager()

    def __str__(self):
        return self.name

Пожалуйста, поделитесь своими конкретными требованиями или проблемами, с которыми вы сталкиваетесь. Это поможет найти идеальное решение.

Вернуться на верх