关于自定义用户模型的 Django 最佳实践

Django best practices regarding custom User models

这更像是一个一般的最佳实践问题。当你在Django中开始一个新项目时,你一般是创建一个自定义的User模型,还是依赖默认的?

就我个人而言,如果我不弄乱默认的用户模型,它似乎更干净。如果我想添加任何额外的属性,我觉得添加一个 ProfileUserInfo 模型与一个 one-to-one/foreign 与用户的关键关系更简单。

我读过很多关于 Django 的文章,但不同意这一点。显然建议构建自定义用户模型?我很好奇每个人都在做什么,如果我做出这些选择中的任何一个,我到底错过了什么。

当您必须向用户模型添加新字段或逻辑时(例如使用电子邮件而不是用户名登录或添加新权限),自定义用户模型是一种很好的做法。 如果您的应用程序很简单并且您不必添加新字段,则可以使用默认用户模型。 其他解决方案是保持用户模型完整并创建一个与用户具有 OneToOne 关系的“用户配置文件”模型,但您必须手动创建配置文件并将其添加到用户,或者使用 django 信号创建用户配置文件每次创建新用户时。 我个人不推荐最后一种解决方案。 因此,如果必须添加新字段或逻辑,则应创建自定义用户模型,否则请坚持使用默认用户模型。 如果您使用自定义模型,请记住将新字段添加到管理站点 这是一个例子

    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)

SOLID 原则:单一职责设计模式建议同时拥有用户模型和配置文件模型,其中每一个都应该只有一个职责。它可以更轻松地管理您的代码,并将出现错误的可能性降至最低。

以下是有关 SOLID 设计原则的更多信息的一些重要资源: https://www.freecodecamp.org/news/solid-principles-explained-in-plain-english/

https://www.tutorialspoint.com/design_pattern/singleton_pattern.htm

也是设计模式的重要资源: https://youtube.com/playlist?list=PLrhzvIcii6GNjpARdnO4ueTUAVR9eMBpc

(基于 Eric Freeman 和 Elisabeth Robson 的“Head First Design Patterns: Building Extensible and Maintainable Object-Oriented Software”一书。

所有这些都是object-oriented编程的一些重要原则。大多数示例都在 Java 中,但这些概念可以应用于任何语言。我希望这些对您未来的项目也有帮助。这些将使您的代码更容易推理。