我的理解和经验是Django中的request.user
返回类型为SimpleLazyObject
的对象。如何使用此User
SimpleLazyObject
类型的对象
特别是这是我的派生User
模型
models.py
class UserInfo(User):
mobile_number = models.CharField(max_length=10, null=False, blank=False)
purchase_code = models.CharField(max_length=25, null=False, blank=False)
REQUIRED_FIELDS = ['first_name', 'last_name', 'mobile_number', 'password', 'purchase_code']
def clean(self):
self.username = str(self.mobile_number)
我编写了以下函数,除了我必须进行数据库查询外,它似乎完全正常。有没有更好的方法来获取当前登录的实例User
?
# This is a function to obtain the current logged in user. In case no one has logged-in the function
# returns an instance of the class AnonymousUser
def get_user(request):
current_user = request.user #auth.get_user(request)
if type(current_user) is not AnonymousUser:
current_user = UserInfo.objects.get(pk=auth.get_user(request).pk)
return HttpResponse(current_user)
答案 0 :(得分:3)
当您第一次访问其中一个属性时,SimpleLazyObject将解析为实际的User对象。此外,无需检查返回用户的类型,因为您可以直接询问它是否是匿名用户。
def my_view(request):
user = request.user
if user.is_anonymous():
# do something as an anonymous user
else:
return HttpResponse(user.username)
忘记SimpleLazyObject
类型的实际对象。这是一个优化。您正在访问的对象将是您期望的用户实例。
答案 1 :(得分:1)
class UserInfo(models.Model):
user = models.OnetoOneField(User, related_name="user_info")
...
related_name 属性定义从用户模型到自定义用户模型的关系反向关系的名称。它解释为here
现在您可以像这样访问UserInfo的字段
request.user.user_info.mobile_number
也像乔希指出的那样,你可以得到这样的默认用户模型字段
request.user.username