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

Вернуться на верх