Обновление 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?