我有这样的问题。比如我的模型类中有一个字段:
periodic_task = models.OneToOneField(PeriodicTask, null=True, blank=True)
我需要覆盖 save() 方法来设置这个字段值:
def save(self, *args, **kwargs):
super(PostTweetSet, self).save(*args, **kwargs)
self.periodic_task = TaskScheduler.create(
'tweets.tasks.post_next_tweet', self.interval.period,
self.interval.every, args="[" + '"%s"' % str(self.pk) + "]")
您会看到 self.periodic_task 在实际调用 super() 方法后被分配。我这样做是因为需要一个 pk 字段(我在 TaskScheduler 创建方法中使用它)。另一方面,我需要在设置这个新字段后更新这个模型的数据库表。如果我再次调用 super(),我会得到关于重复 id 的错误。那么,我该怎么做才能使这项工作成功?或者我需要重建我的方法来完成这项任务?谢谢。
请您参考如下方法:
我会使用保存后信号来完成。
如果您不能或者这在其他方面没有吸引力,您可以将您的要求视为两条路径:
- 如果没有主键,需要先保存,然后获取pk
- 如果你已经知道主键,你可以创建你的周期性任务然后调用super
所以类似(伪代码):
def save(...):
if self.pk is None:
super(...)
self.save(...) # Call ourselves -- but this time, we'll have a primary key!
else:
... create your periodic task
super(...)
