モデルの識別子を作成する簡単な信号を作成しようとしています。Django post_save信号は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')
Scheduler
オブジェクトが保存される毎回、私はだから私はpost_save
信号を作成し[weekhour_obj.hour for weekhour_obj in scheduler.weekhours.all()]
のリストに参加identificator
を作成または更新します。問題は、Scheduler
を保存すると、信号がpre_save
のように機能することです。スケジューラー用に設定されたworkhours
は古いものであり、更新されていません。私が2回目にそれを保存するとき、それは動作します。
@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)
どこに問題があるのでしょうか?
EDIT - 例:私は信号方式では最初の行にprint instance.weekhours.all()
を置くとき
それはこのように動作します
時間2時間4とweekhoursとDjangoのadminにスケジューラオブジェクトを作成し- 。 それは何も印刷しませんでした。
- adminにスケジューラを開いて、それが
<QuerySet [<WeekHour: 5>]>
印刷しかし、それはpost_save
で再びスケジューラを開いて、6,7 にweekhoursを変更<QuerySet [<WeekHour: 2>,<WeekHour: 4>]>
pre_save
だったかのように振る舞うのですか?