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

时间:2014-10-26 10:22:36

标签: python django django-models

我的理解和经验是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)

2 个答案:

答案 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)

建议使用one to one relationship

扩展用户模型
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