Django: помогите понять функцию сигнала - PullRequest
0 голосов
/ 15 апреля 2020

Добрый вечер,

Я знаю, я только что задал похожий вопрос go, но у меня все еще были проблемы с пониманием более детальных функций сигнала. Так что я надеюсь, что кто-нибудь может помочь мне с этим !? В качестве примера у меня есть класс в моем "models.py", подобный этому:

class ExampleModel(models.Model):
    name = models.CharField(max_length=255, null=False, blank=False)
    value1 = models.IntegerField()
    value2 = models.IntegerField()
    value_of_1_and_2 = models.IntegerField()

    def __str__(self):
        return self.name

Я бы хотел, чтобы мое поле "value_of_1_and_2" автоматически заполнялось суммой двух других полей перед сохранением. .. Это возможно? Я попробовал кое-что и застрял с «pre_save» вроде этого:

@receiver(pre_save, sender=ExameplModel)
def save(self, *args, **kwargs):
    ...

Спасибо за вашу помощь и приятного вечера всем вам!

1 Ответ

0 голосов
/ 15 апреля 2020

Хотя сигналы логически похожи, они немного отличаются от метода сохранения в классе модели. Чтобы быть более точным 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, и вы увидите результат.

...