У меня есть административная форма с парой строк для отображения полей m2m, например:
class ArticleAdmin(admin.ModelAdmin):
form = ArticleCustomAdminForm
inlines = (SpecificGemInline, SuiteInline,)
Базовый класс выглядит примерно так:
class Article(models.Model):
article_code = models.CharField(max_length=15)
gems = models.ManyToManyField(Gem, through='SpecificGem')
Модель имеетспециальное поле article_code
, которое должно объединять некоторые данные из полей m2m, представленных в обеих строчках, поэтому я написал функцию create_code(instance)
, которая делает это путем прямого доступа к полям экземпляра модели, что-то вроде этого:
def create_code(instance):
article_code_part1 = SpecificGem.objects.filter(article=instance)
article_code_part2 = instance.suite_set.all()
instance.article_code = #do something with both parts
Проблема в том, что когда я вызываю эту функцию из переопределенных функций save_model()
ModelAdmin или save()
модели, следование полям экземпляра m2m приводит к устаревшим результатам.Даже отсталый пример, приведенный ниже, не поможет:
class ArticleAdmin(admin.ModelAdmin):
#...
def save_model(self, request, obj, form, change):
obj.save()
create_code(obj)
obj.save()
Когда я попадаю в метод clean()
InlineFormset, у меня есть доступ к данным его форм, чтобы я мог найти часть article_code даже без фактического сохранения.... но у меня есть две строки.
Итак, как мне найти самый верхний метод сохранения, чтобы я мог вызывать свою функцию агрегирования после того, как все модели проверены и сохранены в db?