Как создать иерархические отношения родитель/ребенок с определенными правами в уже созданном приложении Django (DRF)
Мне нужно создать модель данных в уже существующем приложении Django, которое использует DRF, и я совсем новичок в Django.
Правила таковы:
- Есть
ParentOrganizations
иChildOrganizations
, к которымUsers
может принадлежать. - У
ParentOrganization
может быть многоChildOrganizations
.
- Пользователь приложения может принадлежать ко многим
ChildOrganizations
, но всеChildOrganizations
, к которым они принадлежат, должны принадлежать одному родителю.- Здесь есть оговорка, что внутренние суперпользователи будут иметь доступ ко всем родительским и дочерним организациям .
- Пользователь приложения может иметь различные разрешения для каждого
ChildOrganization
, к которому он принадлежит. - Мы будем использовать Django Admin для создания пользователей и назначения их родительским и дочерним организациям вместе с разрешениями для каждой дочерней организации .
Несколько вопросов и немного кода:
- Это приложение уже существует, так что, похоже, я упустил возможность создать пользовательский класс без некоторых сложностей. Оправдывает ли что-нибудь из вышеперечисленного расширение
auth.User
? Я думаю, что в этом нет необходимости. - Может ли встроенные в Django группы и роли быть подходящим способом для достижения этой цели? Я беспокоюсь о том, чтобы не зациклиться на чем-то, поскольку наши сценарии использования становятся все более сложными.
- Предположим, что я создам это на заказ, как будет выглядеть этот код?
class ParentOrganization(models.Model):
name = models.CharField(max_length=100)
users = models.ForeignKey(User, on_delete=models.CASCADE)
class ChildOrganization(models.Model):
parent = models.ForeignKey(ParentOrganization, on_delete=models.CASCADE)
name = models.CharField(max_length=300)
users = models.ForeignKey(User, on_delete=models.CASCADE)
class ChildOrganizationPermissions(models.Model):
users = models.ForeignKey(User, on_delete=models.CASCADE)
child_organization = models.OneToOneField(ChildOrganization, on_delete=models.CASCADE)
can_view = models.BooleanField()
can_order = models.BooleanField()