2016-12-11 5 views
0

Я пытаюсь создать простой сигнал, который создает идентификатор для модели.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() к первой строке в методе сигнала он действует таким образом:

  1. Созданный объект планировщика в Django администратора с weekhours с час 2 и час 4 Ничего не печатал.
  2. Открыт планировщик в админ и изменил WeekHours от 2 и 4 до 5. Он напечатан <QuerySet [<WeekHour: 2>,<WeekHour: 4>]>
  3. Открыт планировщик снова и изменил weekhours 6 и 7. Он напечатан <QuerySet [<WeekHour: 5>]>

Но это post_save так почему он действует, как будто это pre_save?

ответ

1

Отношения Many-to-many требуют, чтобы родительский объект сохранялся первым. Вы не можете связывать элементы с экземпляром Scheduler, пока он не был сохранен.

В вашем примере вы пытаетесь получить instance.weekhours.all() в post_save, но он будет возвращать всегда None в первом save. для этого вам нужно сделать еще одно сохранение, чтобы получить значения.

Для создания идентификатора

m2m_changed post_save
Смежные вопросы