Лучшие практики Django в отношении пользовательских моделей пользователей

Это скорее общий вопрос о лучших практиках. Когда вы начинаете новый проект в Django, вы обычно создаете пользовательскую модель User или полагаетесь на модель по умолчанию?

Лично мне кажется более чистым, если я не буду возиться с моделью User по умолчанию. Если есть дополнительные атрибуты, которые я хочу добавить, мне кажется, что проще добавить модель Profile или UserInfo с отношением один-к-одному/внешний ключ с User.

Однако многие статьи, которые я читал о Django, не согласны с этим. По-видимому, рекомендуется создавать пользовательскую модель User? Мне интересно, как поступают все, и что именно я упускаю, если сделаю один из этих вариантов

Пользовательская модель пользователя - это хорошая практика, когда вам нужно добавить новые поля или логику в модель пользователя (например, вход в систему с использованием электронной почты вместо имени пользователя или добавление новых разрешений). Если ваше приложение простое и вам не нужно добавлять новые поля, вы можете использовать модель пользователя по умолчанию. Другим решением является сохранение модели пользователя и создание модели "Профиль пользователя" с отношением OneToOne к User, но вам придется создавать профиль вручную и добавлять его к User, или, возможно, использовать сигналы django для создания профиля User каждый раз, когда создается новый пользователь. Я лично не рекомендую последнее решение. Итак, вы должны создать пользовательскую модель User, если вам нужно добавить новые поля или логику, в противном случае придерживайтесь модели User по умолчанию. Если вы используете пользовательскую модель, не забудьте добавить новые поля в админку сайта. Вот пример

    class User(AbstractUser):
        worker = models.OneToOneField(WorkerModel, on_delete=models.CASCADE, 
                    related_name="user", verbose_name=_("Trabajador"), null=True, blank=True)
    
        job = models.CharField(verbose_name="Cargo",max_length=50, null=True, blank=True)
        department = models.CharField(verbose_name="Departamento",max_length=50, null=True, blank=True)
        avatar = models.ImageField(verbose_name="Imagen", upload_to="user_avatar",
                                                    null=True, blank=True)
        class Meta:
            default_permissions = ()
            verbose_name="Usuario"
            verbose_name_plural="Usuarios"
            permissions = (
                ("secretario", "Secretario(a)"),
                ("director", "Director"),
            
            )

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import User #, UserProfileModel
from django.utils.translation import gettext, gettext_lazy as _

class UserAdminInherited(UserAdmin):
    autocomplete_fields = ['worker']
    fieldsets = (
        (None, {'fields': ('username', 'password')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email','job','department','avatar')}),
        (_('Worker info'), {'fields': ('worker',)}),
        (_('Permissions'), {
            'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions'),
        }),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )

admin.site.register(User, UserAdminInherited)
Вернуться на верх