我有许多模型需要回顾创建/更新它们的用户。通常,这只涉及将request.user
传递给相关属性,但是如果可能的话,我想让它自动化。
Doctrine(PHP ORM)的扩展名为Blameable,它会在持久化模型实例时设置对当前经过身份验证的用户的引用,例如:
class Post
{
/**
* Will set this to the authenticated User on the first persist($model)
* @ORM\ManyToOne(targetEntity="User", inversedBy="posts")
* @Gedmo\Blameable(on="create")
*/
private $createdBy;
/**
* Sets this to the authenticated User on the first and subsequent persists
* @ORM\ManyToOne(targetEntity="User")
* @Gedmo\Blameable(on="update")
*/
private $updatedBy;
}
为了在Django中获得相同的功能,我首先想到的是尝试使用pre_save
信号挂钩来模拟它 - 但是我需要在视图函数之外访问请求(looks possible with some middleware但有点hacky)。
Django有类似的功能吗?我最好明确地传递经过身份验证的用户吗?
答案 0 :(得分:0)
Django的解耦程度使得无法在模型实例中自动设置用户。
答案 1 :(得分:0)
中间件解决方案是可行的方法。当我需要这样做时,我只需添加到save()方法,如下所示:
class MyObject(models.Model):
def save(self, *args, **kwargs):
if not self.created_by:
self.created_by = get_requests().user
super(MyObject, self).save(*args, **kwargs)
至于将请求存储在全球字典中的“hackyness”,我想你会克服它。有人曾经说过这种模式,“这是最糟糕的,除了所有其他人”。
P.S。如果你想在你的代码深处使用django.contrib.messages,你会发现它真的很有用。