从 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()
但是由于Account
class是抽象的,所以不存在request.user.account
M2M关系。
我有 request.user.student
、request.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
我有链接到用户的抽象个人资料:
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()
但是由于Account
class是抽象的,所以不存在request.user.account
M2M关系。
我有 request.user.student
、request.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