自定义用户模型是一种好的实践,当您需要添加新字段或逻辑到用户模型时(例如使用电子邮件而不是用户名登录或添加新权限)。
如果您的应用程序很简单,而且不需要添加新字段,则可以使用默认用户模型。
另一种解决方案是保持用户模型不变,并创建一个“用户配置文件”模型,该模型具有与用户的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
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)
User
模型存储的用户数据满意,使用User
模型会更好。虽然你可以使用Profile
模型,但通常会导致更多的查询,并且你需要实现逻辑来自动创建/更新个人资料,这通常不太优雅。 - undefinedProfile
的信号有点麻烦,谢谢你的回答! - undefined