【问题标题】:Create two objects in save method在 save 方法中创建两个对象
【发布时间】:2012-06-13 11:10:16
【问题描述】:

我想覆盖一个保存方法,以便为每个保存创建两个对象,而不是一个。我将如何执行以下操作?

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

【问题讨论】:

    标签: python mysql django django-models


    【解决方案1】:

    做两个super,如果有自动递增字段,不要忘记增加pk,否则IntegrityError会被提升。

    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)
    

    【讨论】:

    • 不要增加 pk,只需将其设为 None 并在调用 save 时让 Django 分配 pk。
    猜你喜欢
    • 1970-01-01
    • 2011-10-03
    • 2013-12-10
    • 1970-01-01
    • 2019-09-20
    • 2011-08-05
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多