У меня есть модели узлов и пользователей, которые принадлежат Организации. Я хочу убедиться, что Пользователь будет когда-либо видеть только экземпляры Node, принадлежащие его Организации.
Для этого я хочу переопределить диспетчер объектов Node тем, который возвращает query_set отфильтрованных результатов, принадлежащих пользователю.
На основе https://docs.djangoproject.com/en/2.1/topics/db/managers/#modifying-a-manager-s-initial-queryset
соответствующий код models.py , который у меня есть ниже:
class Organisation(models.Model):
users = models.ManyToManyField(User, related_name='organisation')
...
class UserNodeManager(models.Manager):
def get_queryset(self, request):
return super().get_queryset().filter(organisation=self.request.user.organisation.first())
class Node(models.Model):
organisation = models.ForeignKey(
Organisation, related_name='nodes', on_delete=models.CASCADE)
uuid = models.UUIDField(primary_key=True, verbose_name="UUID")
...
objects = UserNodeManager
views.py
class NodeListView(LoginRequiredMixin, generic.ListView):
model = Node
EDIT
Я могу добавить собственный query_set к отдельным представлениям, и это работает, как показано ниже:
views.py
class NodeListView(LoginRequiredMixin, generic.ListView):
model = Node
def get_queryset(self):
return Node.objects.filter(organisation__users__id=self.request.user.pk)
Однако я намерен быть СУХИМЫМ и переопределить «основной» метод query_set в одной точке, чтобы любое представление (например, выпадающий список форм, конечная точка API) выполняло запрос, ограниченный пользователем, без дополнительного кода.
Например, я использую общие представления списка django, которые имеют форму для добавления объекта сканирования, который требует от пользователя выбрать узел, к которому принадлежит сканирование. В настоящее время в форме отображаются узлы других организаций, что противоречит необходимой мне логике разрешений.
К сожалению, переопределенное свойство Node.objects, похоже, не оказывает никакого влияния, и любой пользователь может видеть все узлы. Правильный ли я подход?