Как передать request.user модельному менеджеру? - PullRequest
0 голосов
/ 08 января 2020

У меня есть менеджер моделей с get_queryset:

class BookManager(models.Manager):

    def get_queryset(self):

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

Это приводит к ошибке:

AttributeError: у объекта «BookManager» нет атрибута «request»

Я понимаю, что менеджеры "не осведомлены о запросах". Как бы я сделал метод в вашем менеджере / queryset, который принимает параметр для request.user?

1 Ответ

3 голосов
/ 08 января 2020

Краткий ответ: объект запроса доступен только в представлении, поэтому вы не можете предполагать, что он доступен в вашем менеджере моделей.

Передайте его из вашего представления методу в вашем менеджере, который его принимает:

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

Тогда, по вашему мнению, вы можете сделать Book.objects.by_author(request.user). Сначала вам нужно убедиться, что request.user является зарегистрированным пользователем, в противном случае вы получите исключение.

Примечание: В этом конкретном случае я бы не стал go из-за проблем с определением by_author, поскольку это вряд ли делает ваш код более читабельным. Но если есть более сложные запросы, которые вам часто нужны, то может иметь смысл назначить им метод в вашем менеджере для создания DRY кода.

...