Я пытаюсь создать простой сигнал, который создает идентификатор для модели.Django post_save signal действует как pre_save
class Scheduler(models.Model):
weekhours = models.ManyToManyField('WeekHour', related_name='schedulers')
identificator = models.TextField(null=True,blank=True)
class WeekHour(models.Model):
hour = models.PositiveSmallIntegerField(verbose_name='Hour in week (0 - 7*24')
Everytime когда Scheduler
объект сохраняется, я хочу, чтобы создать или обновить identificator
присоединения список [weekhour_obj.hour for weekhour_obj in scheduler.weekhours.all()]
Так что я создал post_save
сигнал. Проблема в том, что когда я сохраняю Scheduler
, сигнал действует как pre_save
. Набор workhours
для планировщика является старым, не обновляемым. Когда я его сэкономлю второй раз, он работает.
@receiver(post_save,sender=models.Scheduler)
def set_identificator(sender,created,instance,**kwargs):
identificator = ','.join([str(x.hour) for x in instance.weekhours.all().order_by('hour')])
models.Scheduler.objects.filter(pk=instance.pk).update(identificator = identificator)
Вы знаете, где проблема?
РЕДАКТИРОВАТЬ - Пример:
Когда я поставил print instance.weekhours.all()
к первой строке в методе сигнала он действует таким образом:
- Созданный объект планировщика в Django администратора с weekhours с час 2 и час 4 Ничего не печатал.
- Открыт планировщик в админ и изменил WeekHours от 2 и 4 до 5. Он напечатан
<QuerySet [<WeekHour: 2>,<WeekHour: 4>]>
- Открыт планировщик снова и изменил weekhours 6 и 7. Он напечатан
<QuerySet [<WeekHour: 5>]>
Но это post_save
так почему он действует, как будто это pre_save
?