Методы модели, сигналы или что-то еще?

Создал приложение учета товаров. Поработал. Вот такая схема.

class Document(models.Model):
    number = models.PositiveIntegerField(unique=True, verbose_name='Номер')
    sale = models.BooleanField(default=True, verbose_name='Расход')


class DocumentItem(models.Model):
    document = models.ForeignKey(Document, on_delete=models.CASCADE, verbose_name='Накладная')
    product = models.ForeignKey('Product', on_delete=models.CASCADE, verbose_name='Товар')
    quantity = models.PositiveIntegerField(verbose_name='Количество')

    def save(self, *args, **kwargs):
        if self.document.sale:
            self.product.stock -= self.quantity
        else:
            self.product.stock += self.quantity
        self.product.save()
        super().save(*args, **kwargs)


class Product(models.Model):
    name = models.CharField(max_length=100, unique=True, verbose_name='Наименование')
    stock = models.IntegerField(default=0, verbose_name='На складе')

@receiver(post_delete, sender=DocumentItem)
def correct_stock_after_delete(sender, **kwargs):
    doc_item = kwargs.get('instance')
    if doc_item.document.sale:
        doc_item.product.stock += doc_item.quantity
    else:
        doc_item.product.stock -= doc_item.quantity
    doc_item.product.save()

Управление осуществляю через админ панель. При сохранении экземпляра DocumentItem, то есть при сохранении накладной Document, в зависимости от флага sale (приходная или расходная накладная), товар на складе либо увеличивается, либо уменьшается на quantity. При удалении экземпляра DocumentItem, то есть при удалении накладной Document, вызывается сигнал post_delete, который корректирует количество товара на складе. Вопрос такой. Сейчас, чтобы скорректировать количество товара в накладной (введено неверное число) нужно удалить эту строку из накладной и забить заново. Как лучше поступить, чтобы можно было корректировать количество в самой накладной?

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