【问题标题】:Get concrete profile from request.user in Django从 Django 中的 request.user 获取具体配置文件
【发布时间】:2020-04-14 04:50:34
【问题描述】:

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

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')

而且我有多个不同的角色和实施 - 学生、导师、管理员等。 我为它们中的每一个创建了一个类,派生自 Account 类。

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

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

现在我想在类对象上调用foo 方法,像这样:

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

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

有什么方法可以得到request.userUser对象的具体账号吗?

【问题讨论】:

    标签: django django-models django-authentication


    【解决方案1】:

    您可以向您的 User 模型添加一个属性,该属性检查 Account 的每个子类并返回与用户有关系的第一个子类。

    这样的东西应该可以工作

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 目前,我正在这样做,是的。但问题是我有 5 个不同的类,我有 5 个嵌套的 try/excepts。它看起来不正确。我正在寻找更好的方法。
      猜你喜欢
      • 1970-01-01
      • 2015-11-26
      • 2018-05-29
      • 2015-04-10
      • 2012-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多