Как расширить менеджер пользователей auth в Django, чтобы добавить собственный метод?

Я использую Python 3.9 и Django 3.2. Я хочу использовать модуль auth от Django для базового управления пользователями и добавил следующее в файл settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'cbapp',
]

Однако я хотел бы изменить первичный ключ таблицы user на UUID и затем добавить свой собственный метод, поэтому я создал этот файл в models/custom_user.py

from django.contrib.auth.models import AbstractUser
from django.db import models


class CustomeUserManager(models.Manager):
    def get_active_users(self):
        qset = CustomUser.objects.filter(
            is_active=True
        )
        return list(qset)
        

class CustomUser(AbstractUser):
    pass
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

    objects = CustomeUserManager()

Я бы все еще хотел иметь доступ к оригинальным методам аутентификации Django, но похоже, что я больше не могу получить к ним доступ, например, "create_user" ...

>>> user = CustomUser.objects.create_user('Dave', 'myemail@test.com', 'johnpassword')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
    user = CustomUser.objects.create_user('Dave', 'myemail@test.com', 'johnpassword')
AttributeError: 'CustomeUserManager' object has no attribute 'create_user'

Как правильно расширить пользовательские методы auth от Django, добавив при этом несколько своих собственных?

Они указаны в UserManager [Django-doc], поэтому вы должны наследовать от UserManager вместо простого Manager:

from django.contrib.auth.models import UserManager

class CustomeUserManager(UserManager):
    def get_active_users(self):
        return CustomUser.objects.filter(
            is_active=True
        )

Я бы настоятельно рекомендовал не возвращать список, а QuerySet для вашего get_active_users. QuerySet можно фильтровать дальше и, таким образом, не делать запрос к базе данных, который затем должен быть обработан на уровне Django/Python.

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