Как изменить связанную модель в 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() # Сохраняем