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

watbbzwu  于 2023-05-19  发布在  Go
关注(0)|答案(2)|浏览(165)

我有一个模型管理器,带有get_queryset

class BookManager(models.Manager):

    def get_queryset(self):

        return super().get_queryset().filter(author=self.request.user

这将导致错误:
属性错误:“BookManager”对象没有属性“request”
我知道管理者是“不知道请求”的。我如何在你的manager/queryset中创建一个方法,它接受request.user的参数?

d7v8vwbk

d7v8vwbk1#

简短回答:request对象只在视图中可用,所以不能假设它在模型管理器中可用。
将它从视图传递到管理器中接受它的方法:

class BookManager(models.Manager):
    def by_author(self, user):
        return self.get_queryset().filter(author=user)

在你看来,你可以做Book.objects.by_author(request.user)。你需要首先确保request.user是一个登录用户,否则你会得到一个异常。
注意:在这个特殊的例子中,我不会去定义by_author,因为它几乎不会使您的代码更具可读性。但是如果您经常需要更复杂的查询,那么在管理器中为它们分配一个方法来创建DRY代码可能是有意义的。

xj3cbfub

xj3cbfub2#

如果用户是当前用户,则可以使用线程。您可以在身份验证类中设置它并检索它

相关问题