繁体   English   中英

Django 用户类型定义

[英]Django User Type Definition

在 Django 中:从 Python OO 的角度来看,如果我想要不同类型的用户,我不应该拥有从 AbstractUser 扩展的“教师”对象类型和“学生”对象类型吗?

看起来所有的解决方案都提到只是扩展了两个用户所需的所有字段,并且只在表单时间使用教师或学生所需的字段。 只是试图坚持使用 OO 方法,从新手的角度来看这对我来说很有意义。 拥有不同的对象类型将允许我测试对象的类型而不是查看属性,并且只有对象中定义的每种类型所需的字段。

有没有正确的方法来做到这一点,所以我有不同对象类型的用户? 我可以在用户模型中嵌入一个教师或学生类型的对象作为字段吗? 只是猜测? 让我知道您能做什么,并感谢您的专业礼貌回复和耐心。

这是一个很好的解决方案吗? https://github.com/mishbahr/django-users2

这是我在互联网上看到的反复出现的主题... django 创建多种类型用户的最佳方法

这有点像为用户分配配置文件。 我这样做的方式是自定义用户模型上的type字段,然后根据该类型创建TeacherStudent的相关模型。

看看那里的django-users2代码的年龄,我不会使用它,因为它已经有 6 或 7 年的历史了。 你可能会通读它并调整它的概念,但我不会按原样使用它。

我创建与用户关联的配置文件的方式是通过这样的信号;

from django.contrib.auth import get_user_model
from django.db.models.signals import post_save
from django.dispatch import receiver

from ..models import Profile


@receiver(post_save, sender=get_user_model())
def auto_create_profile(instance, **kwargs):
    """
    Anytime a User object is created, create the associated Profile object
    alongside it
    """
    if kwargs.get('created', False):
        Profile.objects.create(
            user=instance
        )

所以你也可以调整它来检查类型;

    if kwargs.get('created', False):
        if instance.type == 'teacher':
            Teacher.objects.create(
                user=instance
            )

然后你的模型只需要一个指向用户的链接,这作为OneToOneField是有意义的;

class Profile(models.Model):
    """
    Profile model
    """
    class Meta:
        """
        Metadata
        """
        app_label = 'accounts'
        verbose_name = _('User profile')
        verbose_name_plural = _('User profiles')

    user = models.OneToOneField(
        verbose_name=_('User'),
        to=settings.AUTH_USER_MODEL,
        related_name='profile',
        on_delete=models.CASCADE
    )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM