Как заполнить поле модели с помощью сигналов django с post_save? - PullRequest
0 голосов
/ 29 мая 2019

После создания модельного объекта я хотел бы использовать сигнал post_save для заполнения другого поля модели в том же объекте идентификатором и другими значениями.

Но реальный вопрос здесь в том, как мне получить доступ к полю из экземпляра?ничего не получалось

Пример: Пользователь создает объект -> id объекта составляет 93 -> Я хотел бы добавить #00093 в качестве значения другого поля в том же объекте.

models.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)

сигналов.py

@receiver(post_save, sender=Ticket)
def ticket_designation(sender, instance, **kwargs):
    instance.designation = "#" + "000" + str(instance.id)
    print("Ticket" + instance.designation + " was created.")

1 Ответ

2 голосов
/ 29 мая 2019

Я думаю, что вы действительно хотите сделать это:

@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.filter(..).update(..): мы не можем сделать instance.save(), так как тогда он снова вызовет post_save и произойдет рекурсия..update в наборе запросов не вызывает сигналы, поэтому мы в безопасности.


Если вы хотите использовать instance.save, вы можете посмотреть , как предотвратить рекурсию post_save в django.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...