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

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

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

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

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

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

最佳答案 这并没有真正回答你的问题,但你确定要通过用户的方法来处理友谊吗?我这样说是因为:

>关于友谊的逻辑大概是在另一个应用程序中,所以你可能想明确调用该应用程序中定义的函数;
>友谊几乎总是对称关系,因此在User上使用方法会导致冗余(a.is_friend_with(b)== b.is_friends_with(a)).例如,如果您以后想要缓存调用的结果,那么定义一个只接受用户对象作为任意排序参数的函数是有意义的;和,
>您可能不希望对HttpRequest或User执行任何过于花哨的操作,因为它可能会混淆其他开发人员.

我的方法是在代表友谊的任何模型上定义一个管理器方法,并明确地将用户传递给它,如下所示:Friendship.objects.are_friends(other_user,request.user).

点赞