我想覆盖一个保存方法,以便为每个保存创建两个对象,而不是一个.我该怎么办?
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
解决方法:
进行两个超级运算,如果存在自动递增字段或将引发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)
标签:python,django,mysql,django-models
来源: https://codeday.me/bug/20191201/2079203.html