I have a problem to add permissions in Django post_save signal because the m2m relationships don't persist. They are correctly displayed with user_permissions.all() after assignment, but as soon as I save the model again the queryset get empty. What am'I doing wrong ?
I don't have the same problem if I assign permissions at the object level with guardian.
models.py
class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(db_index=True, max_length=255, unique=True, null=True, blank=True)
    last_name = models.CharField(max_length=255, null=True, blank=True)
    first_name = models.CharField(max_length=255, null=True, blank=True)
    email = models.EmailField(db_index=True, unique=True)    
    def save(self, *args, **kwargs):
        return super(User, self).save(*args, **kwargs)
class Manager(User):
    ...
    def save(self, *args, **kwargs):
        return super(Manager, self).save(*args, **kwargs)
signals.py
@receiver(post_save, sender=Manager)
def assign_manager_permissions(sender, instance, created, raw, using, **kwargs):
    content_type = ContentType.objects.get_for_model(Manager)
        
    print('Current permissions:')    
    for p in instance.user_permissions.all():
        print(p)
    for codename in ['view_manager',
                         'change_manager',
                         'add_manager',
                         'delete_manager']:
        permission = Permission.objects.get(content_type=content_type, codename=codename)
        instance.user_permissions.add(permission)
    instance.refresh_from_db()
    
    print('After refresh permissions:')
    for p in instance.user_permissions.all():
        print(p)
When I save the model the result is always the same:
django-1  | Current permissions:
django-1  | 
django-1  | After refresh permissions:
django-1  | user | manager | Can add manager
django-1  | user | manager | Can change manager
django-1  | user | manager | Can delete manager
django-1  | user | manager | Can view manager
