django自定义保存方法问题与新创建的对象ID

时间:2011-11-03 17:01:34

标签: django django-models

以下是我在模型中的保存方法之一。

我试图在保存对象时使用新创建的id来填充另一个字段,如第73行所示。这可能不是很好,因为该对象尚未创建。

做我想要达到的目标的最佳方法是什么?我应该将super方法移动到哪里?

 64     def save(self, *args, **kwargs):
 65         '''
 66         Save invoice and receipt number
 67         '''
 68         
 69         if self.status == 'pending' and self.invoice is None:
 71             invoice = "%s-Inv-%s-%s" % (self.event.event_acronym,
 72                                         date.today().strftime('%y%m%d'),
 73                                         self.id)
 74             self.invoice = invoice
 75             super(Order, self).save(*args, **kwargs)
 76 
 77         if self.status == 'completed' and self.receipt is None:
 78             total_success = Order.objects.all.filter(status='completed').count()
 79             if not total_success:
 80                 receipt = "%s-R-%s-%s" % (self.event.acronym,
 81                                           date.today().strftime('%y%m%d'),
 82                                           1)
 83             else:
 84                 receipt = "%s-R-%s-%s" % (self.event.event_acronym,
 85                                           date.today().strftime('%y%m%d'),
 86                                           total_success + 1)
 87             self.receipt = receipt
 88             self.receipt_date = datetime.datetime.now
 89             super(Order, self).save(*args, **kwargs)

3 个答案:

答案 0 :(得分:0)

我建议您使用信号而不是覆盖对象中的方法保存:

https://docs.djangoproject.com/en/1.3/ref/signals/#django.db.models.signals.post_save

如果你在第75行的方法save中调用方法save,你可能会遇到重现的问题,也许你需要找出在pre_save信号中执行的代码(对象her3可能没有id)和post_save中的内容(这里)总是有id)

答案 1 :(得分:0)

如果要访问已保存的对象,则需要先运行super()。save() 所以例如将上面的第75行移到第71行之前

尽管可能值得退一步思考你实际试图实现的目标。如上所述,信号可能是你的朋友

答案 2 :(得分:0)

你的问题是自己没有id,直到之后由ORM保存。

if not self.id:
   # is True the first time an object is saved

一个信号可以让你在保存对象后触发一个功能,所以它会有你的ID,你可以开展你的业务。