2013-06-28 9 views
0

Я пытаюсь выполнить create_reminder_send_message(), выполненное ВПЕРВЫЕ, сохраняется объект напоминания и сохраняется память Reminder.users. Код, как он выполняется каждый раз, когда я обновляю объект ... что мне не хватает? Как я могу выполнить то, что хочу? m2m_changed сигналDjango: как выполнить код ТОЛЬКО после того, как в первый раз добавлены отношения M2M?

class Reminder(models.Model): 
    METHODS = (
     ('EM', 'Send Email'), 
     ('TS', 'Create Dashboard Task'), 
     ('ET', 'Both (recommended)') 
    ) 
    info = models.TextField() 
    method = models.CharField(max_length=3, choices=METHODS, db_index=True, 
           help_text='''How should I remind the user? (
           remember that the backend will not be able to 
           send the emails if the users haven't set it up 
           in their profile options)''') 
    users = models.ManyToManyField(settings.AUTH_USER_MODEL, 
            related_name='reminders') 
    due_date = models.DateField(blank=True, null=True, db_index=True) 
    remind_date = models.DateField(db_index=True) 
    sent = models.BooleanField(default=False, db_index=True) 
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, 
            related_name='created_by') 

def create_reminder_send_message(sender, **kwargs): 
    ''' 
    A signal that creates a new "Message" when a reminder is assigned 
    to a user or group of users. 
    ''' 
    instance = kwargs.get('instance') 
    text = "I have added a new reminder for you. \nActivation date: {0}".format(instance.remind_date) 
    message = Message.objects.create(user=instance.created_by, 
        subject='New reminder!', body=text, draft=False) 
    message.to = instance.users.all() 
    message.received = timezone.now() 
    message.save() 


models.signals.m2m_changed.connect(create_reminder_send_message, sender=Reminder.users.through) 
+0

в методе сигнала вы можете не просто выполнить экземпляр .users.count() == 0'? – karthikr

+0

, но мне нужно назначить instance.users.all() на message.to –

+0

. Я получаю это, но до этого сделаю чек и сделаю все, что вы хотите, если условие пройдет – karthikr

ответ

0

Джанго предлагает Вам action argument. Вы можете проверить приемник сигнала, если action - pre_add, а затем проверьте, существует ли уже напоминание. Это будет работать, за исключением случая, когда все напоминания удаляются, а новый создается - не знаю, нормально ли вам выполнить код. В противном случае единственная возможность - хранить дополнительные данные, например. вы можете установить логическое значение в True в первый раз или сохранить instance, а также в своем Message объекте, чтобы вы могли проверить, существует ли сообщение ...