Вызывайте сигнал Django только в том случае, если запись только что создана - Django
Я использую сигнал Django post_save
, который срабатывает всякий раз, когда создается новая запись. Этот сигнал вызывается каждый раз, когда происходит действие сохранения. Несмотря на то, что у него есть поле created
boolean, эта функция выполняется все время.
Проблема в том, что при каждом запросе я обновляю User
таблицу last_login
и поля last_active
. Следовательно, при каждом запросе выполняется этот сигнал. Несмотря на то, что мы создали булево поле, вызов функции происходит. что может привести к снижению производительности, когда у нас миллион запросов одновременно.
Я ищу решение, сигнал должен выполняться только в том случае, если в таблице User
создана новая запись.
Код примера:
@receiver(post_save, sender=User, dispatch_uid="call_method")
def call_method(sender, instance, created, **kwargs):
print ('>>>>>>>>>> Signal Called ', instance)
if created:
print ('$$$$$$$$$$$ User created')
Помогите мне найти лучшее решение.
Если вы вызываете сохранение на экземпляре модели, то нет никакого способа обойтись без сигнала. Однако если вы измените способ обновления экземпляра пользователя, вы можете пропустить сигнал.
Например, это не вызовет событие post_save
User.objects.filter(id=1).update(last_login=timestamp)
Рассмотрите возможность переноса логики, реализуемой вашим сигналом, в custom_save() вашего класса User или перепишите функцию save() по умолчанию...
Хитрость заключается в том, чтобы поместить ваши инструкции за условием существования первичного ключа у сохраняемого объекта. Таким образом, при вызове метода custom_save() или save() ваша логика будет выполняться только для первой записи (т.е. создания)
Практический пример:
class User(models.Model)
...
email = models.Charfield(max_lenght=250, unique=True)
# Overwrite Save method
def save(self, *args, **kwargs):
...
if not self.pk: # Means that it is the first record of this object
print (f'{self.email} User created')
super().save(*args, **kwargs)
Для этого можно использовать сигнал pre_save.
pre_save:- Чтобы выполнить некоторый код, работающий с другой частью вашего приложения, до того, как объект будет сохранен в базе данных, вы должны использовать сигнал pre_save.
@receiver(pre_save, sender=User, dispatch_uid="call_method")
def trigger_emails_to_employees(sender, instance, **kwargs):
if not instance.pk: # A newly created object (not denotes that the instance does not exists till now)
print("Send email, trigger msgs, block previous records")
print("Do whatever you want before creating the new object")
------------------------------
if instance.pk: # Invokes only when object is being edited.
print("Trigger editing object things before the object get updated")
print("Do whatever you want before editing the existing object")