Попытка ограничить элементы определенным пользователем в наборе запросов Django Class Based View

У меня есть следующие модели:

class AccountManager(models.Model):
    account_manager = models.ForeignKey(
      settings.AUTH_USER_MODEL, 
      on_delete=models.CASCADE
    )

    def __str__(self):
        return str(self.account_manager)

class Client(models.Model):
    account_manager = models.ForeignKey(AccountManager, on_delete=models.CASCADE, related_name='account_manager_clients')
    client = models.CharField(max_length=255)

    def __str__(self):
        return self.client

class Contract(models.Model):
    client = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='client_contracts')
    site_name = models.CharField(max_length=255)

    def __str__(self):
        return self.site_name

Я могу ограничить клиентов определенными менеджерами счетов, используя следующее представление

class ClientListView(LoginRequiredMixin, ListView):
    model = Client
    template_name = "clients/list.html"

    def get_queryset(self, *args, **kwargs):
        return (
            super()
            .get_queryset(*args, **kwargs)
            .filter(account_manager__account_manager=self.request.user)
        )

Однако я не могу ограничить контракты менеджером счета со следующим представлением:

class AMContractDetailView(LoginRequiredMixin, DetailView):
    model = Contract
    template_name = 'contracts/am_contract_detail.html'

    def get_queryset(self, *args, **kwargs):
        return (
            super()
            .get_queryset(*args, **kwargs)
            .filter(client__account_manager=self.request.user.id)
        )

Это позволяет менеджерам по работе с клиентами видеть всех клиентов, а не только своих. Я знаю, что делаю что-то принципиально неправильно, но я немного заблудился!

Любая помощь будет принята с благодарностью.

Я не уверен, что полностью понимаю, в чем здесь источник проблемы, но я рекомендую вам выбрать другой подход, предложенный здесь в другом вопросе на StackOverflow: ваше представление на основе класса AMContractDetailView может наследоваться от UserPassesTestMixin (см. документацию Django), чтобы проверить, должен ли пользователь иметь возможность видеть эту страницу.

В противном случае, попробуйте переопределить другой метод DetailView, например get (все доступные методы перечислены здесь ).

Кстати, ваши представления ClientListView и AMContractDetailView имеют 2 родительских метода. Чтобы разрешить потенциальную двусмысленность при вызове super, я думаю, вам следует явно передать аргументы функции, например, super(DetailView, self).

Вернуться на верх