将用户从一个模型保存到另一个模型

时间:2013-12-02 22:55:53

标签: django django-models django-orm

我想要做的是,每当我创建新邮件时,我都希望将sender的{​​{1}}添加到该Message的{​​{1}}中(与其有关的user)。

我该怎么做?可以通过覆盖Thread方法来完成吗?我可以在views.py中完成它,但我希望如果我可以在models.py中添加它会更好。任何帮助都将非常感激。谢谢!

Message

2 个答案:

答案 0 :(得分:4)

您可以查找反向外键并获取特定线程的所有用户,而无需手动将其放入Thread

然后,您可以通过反向查找获得与线程关联的用户:

User.objects.filter(message__thread=thread)

答案 1 :(得分:3)

如果您不想主动拉动用户设置为dm03514显示,例如,如果您希望默认情况下将用户添加到该线程,但是保持能够在以后的多线程中将它们从线程中删除,那么您确实可以通过覆盖save方法或使用post_save信号来实现此目的。

save几乎适用于所有情况 - post_save的优势在于它可以更加可靠地区分保存新邮件和保存对现有邮件的编辑。但是,如果您没有使用预先选择的PK创建消息或从夹具加载它们save可以正常工作:

class Message(models.Model):
    def save(self, *args, **kwargs):
        probably_new = (self.pk is None)
        super(Message, self).save(*args, **kwargs)
        if probably_new:
            self.thread.user.add(self.sender)

信号看起来像这样:

from django.db.models.signals import post_save

def update_thread_users(sender, **kwargs):
    created = kwargs['created']
    raw = kwargs['raw']
    if created and not raw:
        instance = kwargs['instance']
        instance.thread.user.add(instance.sender)

post_save.connect(update_thread_users, sender=Message)

然后查看有关在多次导入时防止重复信号的文档: https://docs.djangoproject.com/en/dev/topics/signals/#preventing-duplicate-signals