Как изменить связанную модель в django admin?

Есть 2 модели в проекте

models.py

class Material(models.Model):
   title = models.CharField(max_length=255, verbose_name='Название нити', default='Название')
   firm = models.CharField(max_length=255, verbose_name='Фирма производитель')
   color = models.ForeignKey(Colors, on_delete=models.CASCADE, verbose_name='Цвет', related_name='colors')
   mass = models.FloatField(verbose_name='Масса на складе (кг)')
   type = models.ForeignKey(Type, verbose_name='Тип материала', on_delete=models.CASCADE)

class MaterialTaked(models.Model):
   profile = models.ForeignKey(Profile, on_delete=models.SET_NULL, null=True, verbose_name='Старший взял')
   taked_mass = models.FloatField(verbose_name='Взятая масса')
   material = models.ForeignKey(Material, on_delete=models.SET_NULL, null=True, verbose_name='Материал')

admin.py

class MaterialAdmin(admin.ModelAdmin):
   list_display = ['firm', 'mass', 'type', 'color']

class MaterialTakedAdmin(admin.ModelAdmin):
   list_display = ['profile', 'taked_mass', 'material']

   def save_model(self, request, obj, form, change):
      obj.material.mass -= obj.taked_mass
      return super().save_model(request, obj, form, change)

admin.site.register(MaterialTaked, MaterialTakedAdmin)
admin.site.register(Material, MaterialAdmin)

Пусть есть объект Material: title='Название', firm='Фирма', color='Белый', mass=150 При создании объекта MaterialTaked и выбора в качестве material, указанный выше и taked_mass = 10 То из объекта Material mass автоматически должна стать 140

Пробовал использовать

def save_model(self, request, obj, form, change):
  obj.material.mass -= obj.taked_mass
  return super().save_model(request, obj, form, change)

Не получилось. Подскажите пожалуйста.

Возможно есть варианты лучше, но можно сделать через signals:

from django.dispatch import receiver
from django.db.models.signals import post_save


@receiver(post_save, sender=MaterialTaked)  # Ждём сигнала, что в базе произошли изменения
def on_material_taked(sender, instance: MaterialTaked, created, **kwargs):
    if created:  # Проверяем, что в базе создали новый объект, а не обновили существующий
        instance.material.mass -= instance.taked_mass  # Изменяем массу
        instance.material.save()  # Сохраняем

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