以下是我在模型中的保存方法之一。
我试图在保存对象时使用新创建的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)
答案 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,你可以开展你的业务。