我正在将User对象序列化为JSON,并且我想在JSON响应中指出序列化用户是否是用户发出请求的朋友。
我在我的User模型中添加了一个to_dict()方法,该方法执行序列化对象所需的预处理 - 这将是一个添加指示友谊的属性的好地方,但是因为User.to_dict()没有无法访问请求对象,我似乎无法在那里进行。
在视图中执行它很容易,但我不想在其他视图中重复该代码。我想将User对象“升级”为请求感知的User对象。
django.contrib.auth用户模型有一个is_authenticated属性,它实际上是请求的属性而不是模型的属性 - 该属性仅在特定Web请求的上下文中有意义。
就好像我应该将request.user替换为RequestUser实例,这是一个带有用户和请求的新类,并添加了特定于请求的属性。干净的方法是什么?
答案 0 :(得分:1)
这并不能真正解答您的问题,但您确定要通过User上的方法来处理友谊吗?我这样说是因为:
a.is_friend_with(b) == b.is_friends_with(a)
)。例如,如果您以后想要缓存调用的结果,那么定义一个只接受用户对象作为任意排序参数的函数是有意义的;和,我的方法是在代表友谊的任何模型上定义一个管理器方法,并明确地将用户传递给它,如下所示:Friendship.objects.are_friends(other_user, request.user)
。
答案 1 :(得分:1)
您可以创建auth.User的代理模型,并在那里添加您的is_friend方法。 http://docs.djangoproject.com/en/dev/topics/db/models/#proxy-model-managers
至于is_authenticated方法,它比你想象的要简单一点。如果用户上下文处理器未登录,则可以使用特殊类型的用户,即AnonymousUser。调用is_authenticated时,此类始终返回False。同样,当调用is_authenticated时,常规User类总是返回True。
简而言之,不要担心请求对象。如果当前用户未登录,则视图中可用的用户变量将使用AnonymousUser类,并且将找不到您的is_friends方法。