Skip to main content
 首页 » 编程设计

python之Django,如何在调用 super() 后更新 save() 方法中的模型

2025年05月04日24xing901022

我有这样的问题。比如我的模型类中有一个字段:

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(...)