如何将 request.user 传递给模型管理器?

ali*_*s51 1 django django-models django-managers

我有一个模型管理器get_queryset

class BookManager(models.Manager):

    def get_queryset(self):

        return super().get_queryset().filter(author=self.request.user
Run Code Online (Sandbox Code Playgroud)

这导致错误:

AttributeError: 'BookManager' 对象没有属性 'request`

我知道经理是“不知道请求的”。我将如何在您的经理/查询集中创建一个为 request.user 提供参数的方法?

dir*_*ten 5

简短回答:请求对象仅在视图中可用,因此您不能假设它在模型管理器中可用。

将它从您的视图传递给您的经理中接受它的方法:

class BookManager(models.Manager):
    def by_author(self, user):
        return self.get_queryset().filter(author=user)
Run Code Online (Sandbox Code Playgroud)

那么在你看来你可以做到Book.objects.by_author(request.user)。您需要首先确保这request.user是一个登录用户,否则您会得到一个例外。

注意:在这种特殊情况下,我不会遇到定义的麻烦,by_author因为它几乎不会使您的代码更具可读性。但是,如果您经常需要更复杂的查询,那么在您的经理中为它们分配一个方法来创建 DRY 代码可能是有意义的。