Save the user from one model to the another model

36 views
Skip to first unread message

Aamu Padi

unread,
Dec 2, 2013, 10:49:55 PM12/2/13
to django...@googlegroups.com
What I want to do is, whenever I create a new message, I want the sender of the Message to be added to the user of the Thread. How do I do that?
 
class Thread(models.Model):
    user = models.ManyToManyField(User)
    is_hidden = models.ManyToManyField(User, related_name='hidden_thread', blank=True)

    def __unicode__(self):
        return unicode(self.id)

class Message(models.Model):
    thread = models.ForeignKey(Thread)
    sent_date = models.DateTimeField(default=datetime.now)
    sender = models.ForeignKey(User)
    body = models.TextField()
    is_hidden = models.ManyToManyField(User, related_name='hidden_message', blank=True)

    def __unicode__(self):
        return "%s - %s" % (unicode(self.thread.id), self.body)

jirka.v...@gmail.com

unread,
Dec 3, 2013, 8:09:32 AM12/3/13
to django...@googlegroups.com
You're probably looking for something along the lines of:

thread = Thread.objects.get(id=<someid>)
msg = Message.objects.get(id=<someid>)

thread.user.add(msg.sender)

Look at add() and remove() methods in documentation (search for related managers).

FYI - it's a good practice to name fields that use ManyToMany field in plural, i.e. Thread.users would be better than Thread.user

HTH

Jirka

From: Aamu Padi <aamu...@gmail.com>
Date: Tue, 3 Dec 2013 04:19:55 +0530
Subject: Save the user from one model to the another model
--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAHSNPWveL8rqDLenDLayGrtC_RAwQ-Pfp0SYravr7%2BuJzhBhXw%40mail.gmail.com.
For more options, visit https://groups.google.com/groups/opt_out.

Aamu Padi

unread,
Dec 3, 2013, 11:56:23 AM12/3/13
to django...@googlegroups.com
Ok! Plural names. Got it. But I was looking for something more of a overriding the save method for the Thread class, so that I don't have to do that in the view.


antialiasis

unread,
Dec 3, 2013, 12:54:19 PM12/3/13
to django...@googlegroups.com
This seems like a job for signals. Register a post_save signal for the Message class, something like this:

from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import Message, Thread

@receiver
(post_save, sender=Message) def add_to_thread(sender, instance, created, **kwargs): if created:
instance.thread.user.add(instance.sender)

Timothy W. Cook

unread,
Dec 3, 2013, 1:14:50 PM12/3/13
to django...@googlegroups.com
On Tue, Dec 3, 2013 at 9:56 AM, Aamu Padi <aamu...@gmail.com> wrote:
> Ok! Plural names. Got it. But I was looking for something more of a
> overriding the save method for the Thread class, so that I don't have to do
> that in the view.
>

You can do it in the same view as the message. You aren't limited to
working with only one model in a view.

HTH,
Tim
> https://groups.google.com/d/msgid/django-users/CAHSNPWtJ80rqeDgJU4x3xk%2B3ABR1SKjA%2BohsPa3cPezx8O%3Darg%40mail.gmail.com.
> For more options, visit https://groups.google.com/groups/opt_out.



--
MLHIM VIP Signup: http://goo.gl/22B0U
============================================
Timothy Cook, MSc +55 21 94711995
MLHIM http://www.mlhim.org
Like Us on FB: https://www.facebook.com/mlhim2
Circle us on G+: http://goo.gl/44EV5
Google Scholar: http://goo.gl/MMZ1o
LinkedIn Profile:http://www.linkedin.com/in/timothywaynecook

antialiasis

unread,
Dec 3, 2013, 2:52:31 PM12/3/13
to django...@googlegroups.com
I believe what Aamu Padi is getting at is that he doesn't want to do this in the view at all. He just wants it to happen whenever a Message is created. That's a textbook use case for signals.

Aamu Padi

unread,
Dec 3, 2013, 3:47:07 PM12/3/13
to django...@googlegroups.com
Thank you all so much for the answers! I came up with this solution.

class Message(models.Model):
    thread = models.ForeignKey(Thread)
    sent_date = models.DateTimeField(default=datetime.now)
    sender = models.ForeignKey(User)
    body = models.TextField()
    is_hidden = models.ManyToManyField(User, related_name='hidden_message', blank=True)

    def __unicode__(self):
        return "%s - %s - %s" % (unicode(self.thread.id), self.body, self.sender)

    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)

Please correct me, if this is not a good option. But with signals I can check whether its a new created message or not. Does this have any draw backs? Thank you once again!


Reply all
Reply to author
Forward
0 new messages