Django post_save信号就像pre_save一样

时间:2016-12-11 21:32:10

标签: python django django-models django-signals

我正在尝试创建一个简单的信号,为模型创建一个标识符。

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')

每次保存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 admin中创建了一个调度程序对象,其中包含小时2和小时4的工作小时。 它没有打印任何内容。
  2. 在admin中打开调度程序,并将WeekHours从2和4更改为5。 它打印了<QuerySet [<WeekHour: 2>,<WeekHour: 4>]>
  3. 再次打开调度程序,将工作时间更改为6和7。 它打印了<QuerySet [<WeekHour: 5>]>
  4. 但它是一个post_save信号,为什么它的行为像是pre_save

1 个答案:

答案 0 :(得分:2)

if Resultado's status is "OK" then tell location of geometry of item 1 of results of Resultado set latitude to its lat set longitude to its lng end tell end if 关系要求首先保存父对象,在保存之前,不能将项与Many-to-many实例关联。

在您的示例中,您试图在Scheduler中获得instance.weekhours.all(),但它会在第一个post_save中始终返回None。为此你需要做另一个保存以获得价值。

您可以使用m2m_changed代替save来创建标识符