Обновление m2m-поля Django Model, основанное на обновлении другого m2m-поля

Я получил следующую модель:

class Role(models.Model):
    name = models.CharField(max_length=20)
    groups = models.ManyToManyField(
        Group,
        blank=True
    )

    users = models.ManyToManyField(
        User,
        blank=True
    )

и я разработал следующий сигнал:

@receiver(m2m_changed, sender=Role.groups.through)
def sync_groups_and_users_assignment(sender, instance, action, **kwargs):
    Group = kwargs["model"]
    users = []
    # Find users that belong in the groups that have been moved in the group m2m field
    for pk in kwargs["pk_set"]:
        moved_group = Group.objects.filter(pk=pk)
        related_users = User.objects.filter(groups__in=moved_group) 
        for user in related_users:
            users.append(user)
    
    # Move those users accordingly
    for user in users:
        if action == "post_add":
            instance.users_assignment.add(user)
        if action == "post_remove":
            instance.users_assignment.remove(user)
    instance.save()
 

Когда я устанавливаю для поля users значение read only в admin.py сигнал работает как ожидалось. Пользователи, принадлежащие к группе, перемещаются, когда группа перемещается.

class RoleAdmin(VersionAdmin):
    filter_horizontal = ('groups', 'users', )
    readonly_fields = ('users',)

Однако если я удалю readonly_fields = ('users_assignment',), функциональность нарушится.

Я предполагаю, что это происходит потому, что на model.save() django переопределяет значения поля после того, как функция m2m signal изменяет их, что приводит к откату их к значениям UI.

Есть ли способ сказать django, что если поле m2m группы было изменено, то не сохранять значения поля m2m пользователя UI?

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