Я бы хотел отслеживать, какое поле изменилось в любой модели (т. Е. Проводить аудит на уровне модели, поскольку он более атомарный, а не на уровне администратора / формы, как то, что django и django-reversion уже могут делать).Я могу сделать это для любого поля, используя сигналы до / после сохранения / удаления.Однако у меня есть проблема сделать это для поля m2m.
Для приведенного ниже примера кода я определяю поле m2m 'custom_groups' в форме изменения пользователя, поскольку это обратное отношение.Когда пользователь сохраняет форму, например, в интерфейсе администратора, я хотел бы войти, если есть изменение в поле 'custom_groups'.
Модель:
from django.contrib.auth.models import User
class CustomGroup(models.Model):
users = models.ManyToManyField(User, related_name='custom_groups')
ModelForm:
class CustomUserChangeForm(UserChangeForm):
custom_groups = forms.ModelMultipleChoiceField(required=False, queryset=CustomGroup.objects.all())
Проблема с использованием сигнала m2m_changed заключается в том, что я не могу проверить, что фактически изменилось для случая, когда поле m2m обновляется с помощью оператора присваивания:
user.custom_groups = self.cleaned_data['custom_groups']
Это связано с тем, что внутри django выполнит очистку () для * custom_groups *, прежде чем вручную добавлять все объекты.Это выполнит pre / post-clear и затем pre / post save в поле m2m.
Я все это делаю неправильно?Есть ли более простой способ, который действительно может работать?
Спасибо!