После создания объекта модели я хотел бы использовать сигнал post_save
для заполнения другого поля модели в том же объекте с идентификатором и другими значениями.
Но реальный вопрос здесь в том, как мне получить доступ к полю из экземпляра? ничего не получилось
Пример:
Пользователь создает объект -> id
объекта равно 93 -> Я хотел бы добавить #00093
в качестве значения другого поля в том же объекте.
модели.py
class Ticket(models.Model):
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
designation = models.CharField(max_length=255, blank=True, null=True)
summary = models.CharField(max_length=255)
signal.py
@receiver(post_save, sender=Ticket)
def ticket_designation(sender, instance, **kwargs):
instance.designation = "#" + "000" + str(instance.id)
print("Ticket" + instance.designation + " was created.")
один раз при создании объекта
Я думаю, вы действительно хотите сделать это:
@receiver(post_save, sender=Ticket)
def ticket_designation(sender, instance, created, **kwargs):
if created:
designation = "#" + "000" + str(instance.id)
Ticket.filter(pk=instance.pk).update(designation=designation)
print("Ticket" + instance.designation + " was created.")
Объяснение:
зачем использовать if created
: обозначение создается только один раз при создании нового билета. Он не обновляется каждый раз, когда вы сохраняете один и тот же объект.
зачем использовать Ticket.objects.filter(..).update(..)
: мы не можем сделать instance.save()
, так как он снова вызовет это post_save
и произойдет рекурсия. .update
в наборе запросов не вызывает сигналы, поэтому мы в безопасности.
Если вы хотите использовать instance.save
, вы можете посмотреть на как предотвратить рекурсию post_save в django.
хорошо, это сработало, мне пришлось полностью настроить его для моих целей настройки, но я справился с этим благодаря вашему фильтру + рекомендации по обновлению, большое спасибо, хорошего дня!
вы хотите, чтобы
designation
создавался один раз или каждый раз при запуске сигналовpost_save
?