从 Django 中的 request.user 获取具体配置文件

Get concrete profile from request.user in Django

我有链接到用户的抽象个人资料:

class Account(models.Model):
   class Meta:
        abstract = True

    user = models.OneToOneField(settings.AUTH_USER_MODEL, primary_key=True)
    patronic_name = models.CharField(max_length=255, default="")
    # additional fields and methods
    def foo(self):
       print('account')

而且我有多个不同的角色和实现 - 学生、导师、管理员等。 我为他们每个人创建了一个 class,派生自帐户 class.

class Teacher(Account):
    def foo(self):
        print('teacher')
    # ...additional fields and methods

class Student(Account):
        def foo(self):
            print('student')
    # ...additional fields and methods

现在我想在 class 对象上调用 foo 方法,如下所示:

@login_required
def index(request):
   request.user.account.foo()

但是由于Accountclass是抽象的,所以不存在request.user.accountM2M关系。 我有 request.user.studentrequest.user.teacher 关系,但我不知道关系的类型。

有没有办法得到request.user用户对象的具体账号?

你有没有尝试过这样的事情,

@login_required
def index(request):
    <b>try:
        foo_result = request.user.account.foo()
    except AttributeError:
        foo_result = request.user.teacher.foo()</b>
    ...

您可以将 属性 添加到您的 User 模型中,该模型检查 Account 的每个子类和 returns 与用户有关系的第一个子类。

像这样的东西应该可以工作

@property
def account(self):
    for subclass in Account.__subclasses__():
        try:
            return getattr(self, subclass.__name__.lower())
        except DoesNotExist:
            continue