简体   繁体   English

Django-获取登录用户的最有效方法?

[英]Django - most efficient way to get the logged in user?

My understanding and experience is that request.user in Django returns an object of type SimpleLazyObject . 我的理解和经验是Django中的request.user返回类型为SimpleLazyObject的对象。 How do I obtain an object of type User using this SimpleLazyObject 如何使用此SimpleLazyObject获取User类型的对象

In particular this is my derived User model 特别是这是我派生的User模型

models.py 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)

I have written the following function which seems to work perfectly fine except that I have to make a database query. 我写了下面的函数,除了必须进行数据库查询外,它似乎工作得很好。 Is there a better way of getting an instance of the currently logged in User ? 有没有更好的方法来获取当前已登录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)

SimpleLazyObject will resolve to the actual User object when you first access one of its properties. 首次访问对象属性之一时,SimpleLazyObject将解析为实际的User对象。 Also, no need to check the type of the returned user, because you can ask it directly whether or not it's an anonymous user. 另外,无需检查返回用户的类型,因为您可以直接询问它是否是匿名用户。

def my_view(request):
    user = request.user
    if user.is_anonymous():
        # do something as an anonymous user
    else:
        return HttpResponse(user.username)

Forget about the actual object being of the type SimpleLazyObject . 忘记实际类型为SimpleLazyObject对象。 It is an optimisation. 这是一种优化。 The object you're accessing is going to be the User instance you expect. 您要访问的对象将是您期望的User实例。

It is recommended to extend the User model by using a one to one relationship 建议通过使用一对一关系来扩展用户模型

class UserInfo(models.Model):
    user = models.OnetoOneField(User, related_name="user_info")
    ...

The related_name attribute defines the name of relation reverse relation from the User model to your custom user model. related_name属性定义从用户模型到自定义用户模型的反向关系的名称。 It is explained here 在这里解释

Now you access UserInfo's fields like this 现在,您可以像这样访问UserInfo的字段

request.user.user_info.mobile_number request.user.user_info.mobile_number

Also like Josh pointed out, you can get the default User model fields like this 就像Josh指出的那样,您可以像这样获得默认的User model字段

request.user.username request.user.username

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM