我想覆盖一个save方法,以便为每个保存而不是一个保存创建两个对象。我该怎么做?
class Message(models.Model):
thread = models.ForeignKey('MessageThread')
content = models.CharField(max_length=5000)
sender = models.ForeignKey(UserProfile, related_name='message_sender')
# filled in automatically on save()
timestamp = models.DateTimeField(auto_now_add=True)
recipient = models.ForeignKey(UserProfile, related_name='message_recipient')
status = models.CharField(choices=MESSAGE_STATUS, max_length=64, default='unread')
def save(self, *args, **kwargs):
"""
When a message is created, this will save TWO objects of it.
"""
sender = self.sender
thread_initiator = self.thread.initiator
thread_recipient = self.thread.recipient
if sender == thread_recipient:
self.recipient = thread_initiator
else:
self.recipient = thread_recipient
self.status = 'unread'
super(Message, self).save(*args, **kwargs)
# saving the second object creates an error
Message.objects.create(thread=self.thread, content=self.content, sender=sender, recipient=sender, status='read')
--> RuntimeError: maximum recursion depth exceeded while calling a Python object
答案 0 :(得分:3)
做两个super
,如果有自动增量字段或者会引发IntegrityError
,请不要忘记增加pk。
def save(self, *args, **kwargs):
sender = self.sender
thread_initiator = self.thread.initiator
thread_recipient = self.thread.recipient
if sender == thread_recipient:
self.recipient = thread_initiator
else:
self.recipient = thread_recipient
self.status = 'unread'
super(Message, self).save(*args, **kwargs)
# instead of Message.objects.create(thread=self.thread, content=self.content, sender=sender, recipient=sender, status='read')
self.pk +=1
self.sender = sender
self.recipient = sender
self.status = 'read'
super(Message, self).save(*args, **kwargs)