Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么';使用特定于请求的属性装饰Django模型是一种干净的方法吗?_Django_Json_Request - Fatal编程技术网

什么';使用特定于请求的属性装饰Django模型是一种干净的方法吗?

什么';使用特定于请求的属性装饰Django模型是一种干净的方法吗?,django,json,request,Django,Json,Request,我正在将用户对象序列化为JSON,我想在JSON响应中指出序列化的用户是否与发出请求的用户是朋友 我已经在我的用户模型中添加了一个to_dict()方法,该方法进行序列化对象所需的预处理——这是一个添加表示友谊的属性的好地方,但是由于User.to_dict()没有访问请求对象的权限,所以我似乎无法在那里执行该操作 在视图中执行此操作很容易,但我不想在其他视图中重复此代码。我想“升级”用户对象以请求感知用户对象 django.contrib.auth用户模型有一个is_authenticated

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

我已经在我的用户模型中添加了一个to_dict()方法,该方法进行序列化对象所需的预处理——这是一个添加表示友谊的属性的好地方,但是由于User.to_dict()没有访问请求对象的权限,所以我似乎无法在那里执行该操作

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

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


好像我应该用RequestUser的实例替换request.user,这是一个新类,它接受一个用户和一个请求,并添加请求特定的属性。什么是干净的方法呢?

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

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

  • 我的方法是在任何表示友谊的模型上定义一个manager方法,并显式地将用户传递给该模型,如:
    友谊.objects.are\u friends(其他用户,request.user)

    您可以创建auth.user的代理模型,并在其中添加您的is\u friends方法

    至于is_认证方法,它比您想象的要简单一些。用户上下文处理器使一种特殊类型的用户在未登录时可用,即匿名用户。调用is_authenticated时,此类始终返回False。同样,当调用is_authenticated时,常规用户类总是返回True


    简而言之,不要担心请求对象。如果当前用户未登录,则视图中可用的用户变量将使用AnonymousUser类,并且找不到您的is\u friends方法。

    代理模型听起来是对用户进行子类化的好方法,谢谢。谢谢,要点很好。为什么是关于友谊的经理方法而不是班级方法,即友谊。你是朋友吗(a,b)?我已经为这个问题补充了一些细节——想听听你的想法。谢谢类方法也有意义。与类外的实用程序函数一样。我在考虑一个manager方法,因为您可能希望将它链接到其他manager方法(例如filter)之后,以在更有限的查询集中检查
    是否是朋友,但这可能不是必需的/可取的。