Попытка ограничить элементы определенным пользователем в наборе запросов 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)
.