我正在尝试创建一个简单的信号,为模型创建一个标识符。
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()
放入信号方法的第一行时,它就是这样的:
<QuerySet [<WeekHour: 2>,<WeekHour: 4>]>
<QuerySet [<WeekHour: 5>]>
但它是一个post_save
信号,为什么它的行为像是pre_save
?
答案 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
来创建标识符