我有多个User
类型,这些类型由用户个人资料以模型的形式表示:
我需要在每次请求时访问特定的用户个人资料。
为了避免每次都要执行额外的查询,我想直接向select_related
对象中添加一个request.user
。
我在文档中找不到任何有关它的信息。有人知道最好的方法吗?
答案 0 :(得分:12)
有趣的问题。查看AuthenticationMiddleware和auth.get_user的源代码,似乎您唯一需要做的就是实现并使用您自己的身份验证后端。如果您不使用任何其他自定义后端功能,则可以将ModelBackend子类化,仅覆盖get_user
方法来满足您的需求:
class MyModelBackend(ModelBackend):
def get_user(self, user_id):
try:
user = UserModel._default_manager.select_related("profile").get(pk=user_id)
except UserModel.DoesNotExist:
return None
return user if self.user_can_authenticate(user) else None
当然,您需要将其添加到设置AUTHENTICATION_BACKENDS。