Django join ManyToManyField с таблицей пересечений - мягкое удаление
Существует три модели - роль, разрешение и их пересечение в виде RolePermission. Каждая модель имеет флаг active_status для обозначения мягкого удаления. Теперь, когда мы пытаемся получить все роли, объединенные с их соответствующими активными позициями, через модель RolePosition, неактивные все еще там.
class Role(models.Model):
name = models.CharField(_('Role Name'),null=False,max_length=255,unique=True,blank=False)
organization = models.ForeignKey('organization.Organization',blank=False, null=True,on_delete=models.SET_NULL)
active_status = models.CharField(max_length=40,choices=(('ACTIVE','ACTIVE'),('INACTIVE','INACTIVE')),default='ACTIVE')
created_at = models.DateTimeField(default=timezone.now)
updated_at = models.DateTimeField(null=True)
permissions = models.ManyToManyField(Permission, through='RolePermission')
#------------------plan details ---------------------
class Meta:
verbose_name = "role"
db_table = 'ontym_roles'
def __str__(self):
return self.name
def save(self, *args, **kwargs):
''' On save, update timestamps '''
timestamp = timezone.now()
if not self.id:
self.created_at = timestamp
self.updated_at = timestamp
return super(Role, self).save(*args, **kwargs)
#----------------------- manp many to many role permissions -------------------
class RolePermission(models.Model):
role = models.ForeignKey(Role,null=False,blank=False,on_delete=models.CASCADE)
permission = models.ForeignKey(Permission,null=False,blank=False,on_delete=models.CASCADE)
active_status = models.CharField(max_length=40,choices=(('ACTIVE','ACTIVE'),('INACTIVE','INACTIVE')),default='ACTIVE')
created_at = models.DateTimeField(default=timezone.now)
updated_at = models.DateTimeField(null=True)
class Meta:
verbose_name = "role_permission"
db_table = 'ontym_role_permission'
def save(self, *args, **kwargs):
''' On save, update timestamps '''
timestamp = timezone.now()
if not self.id:
self.created_at = timestamp
self.updated_at = timestamp
return super(RolePermission, self).save(*args, **kwargs)
roles = Role.objects.filter(rolepermission__permission__active_status__exact='ACTIVE')
И получить ответ ->
{
"status": true,
"code": 200,
"message": "All Roles fetched sucessfully for current organization",
"data": [
{
"id": 1,
"name": "ROLE_MANAGER",
"active_status": "ACTIVE",
"permissions": [
{
"id": 1,
"name": "ROLE_CREATE",
"active_status": "ACTIVE",
},
{
"id": 2,
"name": "ROLE_VIEW",
"active_status": "ACTIVE",
}
]
},
{
"id": 4,
"name": "MANAGE_",
"active_status": "ACTIVE",
"permissions": [
{
"id": 1,
"name": "ROLE_CREATE",
"active_status": "ACTIVE",
},
{
"id": 2,
"name": "ROLE_VIEW",
"active_status": "ACTIVE",
}
]
},
{
"id": 5,
"name": "ROLE_MANAGER_NEW",
"active_status": "ACTIVE",
"permissions": [
{
"id": 1,
"name": "ROLE_CREATE",
"active_status": "ACTIVE",
},
{
"id": 2,
"name": "ROLE_VIEW",
"active_status": "ACTIVE",
}
]
}
]
}
Снимок БД -> https://drive.google.com/drive/folders/1b_KSyZE7vEwXuoLDEpkWo4YmmaaAQH0n?usp=sharing