gpt4 book ai didi

django - 用特定于请求的属性装饰 Django 模型的干净方法是什么?

转载 作者:行者123 更新时间:2023-12-01 04:20:05 26 4
gpt4 key购买 nike

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

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

在 View 中执行此操作很容易,但我不想在其他 View 中重复该代码。我想将用户对象“升级”为请求感知用户对象。

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

就好像我应该用 RequestUser 的一个实例替换 request.user,一个新的类,它接受一个 User 和一个 Request 并添加特定于请求的属性。有什么干净的方法可以做到这一点?

最佳答案

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

  • 围绕友谊的逻辑大概在另一个应用程序中,因此您可能希望明确调用该应用程序中定义的函数;
  • 友谊几乎总是一种对称关系,因此在 User 上使用方法会导致冗余( a.is_friend_with(b) == b.is_friends_with(a) )。例如,如果您稍后想要缓存调用的结果,那么定义一个简单地接受用户对象作为任意排序参数的函数是有意义的;和,
  • 您可能不想对 HttpRequest 或 User 做任何太花哨的事情,因为这可能会使其他开发人员感到困惑。

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

    关于django - 用特定于请求的属性装饰 Django 模型的干净方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2215286/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com