用特定于请求的属性装饰Django模型的简洁方法是什么?

时间:2010-02-07 00:06:35

标签: django json request

我正在将User对象序列化为JSON,并且我想在JSON响应中指出序列化用户是否是用户发出请求的朋友。

我在我的User模型中添加了一个to_dict()方法,该方法执行序列化对象所需的预处理 - 这将是一个添加指示友谊的属性的好地方,但是因为User.to_dict()没有无法访问请求对象,我似乎无法在那里进行。

在视图中执行它很容易,但我不想在其他视图中重复该代码。我想将User对象“升级”为请求感知的User对象。

django.contrib.auth用户模型有一个is_authenticated属性,它实际上是请求的属性而不是模型的属性 - 该属性仅在特定Web请求的上下文中有意义。

就好像我应该将request.user替换为RequestUser实例,这是一个带有用户和请求的新类,并添加了特定于请求的属性。干净的方法是什么?

2 个答案:

答案 0 :(得分:1)

这并不能真正解答您的问题,但您确定要通过User上的方法来处理友谊吗?我这样说是因为:

  1. 围绕友谊的逻辑大概是在另一个应用程序中,所以你可能想明确调用该应用程序中定义的函数;
  2. 友谊几乎总是对称关系,因此在User上使用方法会导致冗余(a.is_friend_with(b) == b.is_friends_with(a))。例如,如果您以后想要缓存调用的结果,那么定义一个只接受用户对象作为任意排序参数的函数是有意义的;和,
  3. 你可能不希望用HttpRequest或User做任何过于花哨的事情,因为它可能会让其他开发者感到困惑。
  4. 我的方法是在代表友谊的任何模型上定义一个管理器方法,并明确地将用户传递给它,如下所示: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方法。