我有这样的问题。例如,我的模型类中有一个字段:
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
创建方法中使用它)。另一方面,我需要在设置此新字段后更新此模型的db-table。如果我再次致电super()
,我会收到有关重复ID的错误。那么,我该怎么做才能使这个工作?或者我需要重建我的方法来完成这项任务?感谢。
答案 0 :(得分:5)
我使用保存后信号进行操作。
如果你不能或那些没有吸引力的话,你会将你的要求视为两条路径:
类似于(伪代码):
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(...)
答案 1 :(得分:2)
您可能希望在post_save
信号中执行此操作。
答案 2 :(得分:2)
通过在模型override save method
中提供一些条件,我已经达到了相同的要求。
在这个问题中,要求是在保存模型后更新periodic_task
字段,所以这里是我所遵循的sudo代码结构:
class MyModel(models.Model):
periodic_task = models.OneToOneField(PeriodicTask, null=True, blank=True)
def save(self):
super(Asset, self).save()
if not self.periodic_task: # Checking if the section is not updated.
self.periodic_task = #code to update the field.
self.save() #again call the save.
答案 3 :(得分:1)
您可以在super()
覆盖结束时致电save()
。以下是使用slugify()
方法的示例。 slugify方法通过将所有字符转换为小写,将空格转换为破折号将字符串转换为slug。这是代码:
from django.template.defaultfilters import slugify
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Product, self).save(*args, **kwargs)
答案 4 :(得分:0)
如果您不想使用信号,为什么不存储super()
的结果并返回它而不是调用本身呢?
def save(self, *args, **kwargs):
run_task = False
if not self.pk:
run_task = True
result = super().save(*args, **kwargs)
if run_task:
TaskScheduler.create(...)
return result