Давайте предположим, что пользовательский объект ваших менеджеров есть внешний ключ с именем блока на уровне, который они представляют (B1 , C3, ...)
Сначала вам нужен способ получить всех сотрудников, которые являются потомками. Как упоминалось в cleder, django-mptt облегчит вам жизнь. Просто запустите user.unit.get_leafnodes()
с правильной настройкой mptt, и у вас есть весь ваш управляемый сотрудник.
См. MPTTModel.get_leaf_nodes.
Затем вам необходимо использовать эту информацию.
Если вы используете администратор django, вы можете использовать его в ModelAdmin.get_queryset. get_queryset принимает запрос в качестве аргумента. Просто войдите request.user
, и вы снова на ногах. Затем вы можете заблокировать вещи немного больше с ModelAdmin.has_change_permission и семьей.
Если вы хотите большего контроля, взгляните на общие представления, основанные на классе. Ваш views.py
может быть столь же простым, как:
from django.views import generic
from .models import Employee
class EmployeeList(generic.ListView):
def get_queryset(self):
return self.request.user.unit.get_leafnodes()
class EmployeeCreate(generic.edit.CreateView):
fields = ["name"]
def get_queryset(self):
return self.request.user.unit.get_leafnodes()
class EmployeeUpdate(generic.edit.UpdateView):
fields = ["name"]
def get_queryset(self):
return self.request.user.unit.get_leafnodes()
Представления редактирования создаст ModelForm на основе объекта, возвращенного QuerySet. Атрибут полей требуется. См. Документ на generic views и those based on models forms.
Это не очень хороший вопрос, так как здесь нет MVCE, и вы действительно задаете несколько вопросов - дизайн базы данных и пользовательские разрешения, по крайней мере, - я бы посмотрел на http: // stackoverflow.com/help/how-to-ask и посмотреть, можете ли вы отредактировать это соответствующим образом. – Withnail