Хотя сигналы логически похожи, они немного отличаются от метода сохранения в классе модели. Чтобы быть более точным c, они отвечают на следующие вопросы в вашей голове:
- Что я хочу сделать, прежде чем модель будет сохранена / удалена?
- Что я хочу делать после того, как модель будет сохранена / удалена?
- Другое ..
Если мы придем к тому, что вы хотите; Если я правильно понял, вы хотите оставить поле value_of_1_and_2 пустым при сохранении вашей модели, и вы хотите django сохранить его в фоновом режиме с помощью метода, который вы установили.
Прежде всего, я предпочитаю держать сигналы и модели отдельно для чистого вида. Поэтому рядом с файлом models.py создайте файл signal.py .
signal.py:
from .models import ExampleModel
from django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save, sender=ExampleModel)
def pre_save_example_model(sender, instance, *args, **kwargs):
if not instance.value_of_1_and_2:
instance.value_of_1_and_2 = instance.value1 + instance.value2
Затем сделайте следующее определение в apps.py для сигналов для работы (Давайте рассмотрим название приложения: Суммирование . Вы можете заменить его своим.):
apps.py:
from django.apps import AppConfig
class SummingConfig(AppConfig):
name = 'summing'
def ready(self):
from . import signals
И самое важное здесь: поскольку вы оставите поле value_of_1_and_2 пустым, вы должны обновить свое поле следующим образом. В противном случае Django вызовет ошибку.
value_of_1_and_2 = models.IntegerField(blank=True, default=0)
Вот и все. Сохраните модель, введя value1 и value2, и вы увидите результат.