2012-09-11 3 views
1

[Надеюсь, этот пост имеет право правильно]Отправить по электронной почте, как только объект соответствует определенным критериям

У меня есть (вид) «следовать» твиттер, что происходит. Пользователи могут следовать объекту профиля company, который создает объект follower.

class Follower(models.Model): 
    created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 
    profile = models.ForeignKey(UserProfile) 
    company = models.ForeignKey(Company) 
    verified = models.BooleanField(default=False) 
    from_user = models.BooleanField(default=False) 

... 

class Company(models.Model): 
    owner = models.ForeignKey(User, null=True, blank=True, on_delete=models.SET_NULL) 
    name = models.CharField(max_length=200) 
    ... and more fields that aren't relevant 

Что я хочу сделать, это отправить электронное письмо владельцу профиля компании после 5 новых подписчиков. «У вас есть 5 новых последователей!».

Как раз сейчас я посылаю электронное письмо владельцу каждый раз, когда у них появляется новый последователь. Я знаю немного.

Я предполагаю, что мне нужно создать список подписчиков, отправить его, а затем удалить его, чтобы подготовиться к 5 новым подписчикам? Я действительно не уверен, как это сделать. Любая помощь или предложения приветствуются.

вид:

@login_required 
# this is creating a follower. Maybe I shouldn't send the email through this? 
def follow(request, id): 
    company = Company.objects.get(id=id) 
    profile = get_object_or_404(UserProfile, user__username=request.user.username) 
    try: 
     follower = Follower.objects.get(profile=profile, company=company) 
     if not follower.verified: 
      follower.verified = True 
      follower.save() 
     messages.success(request, 'Now following %s\''%company.name) 
     mes = Message(subject="New Follower", sender=profile, recipient=company.owner) 
     mes.body = render_to_string('emails/email-message/new_follower.html', RequestContext(request, { 
     'sender': profile, 
     'receiver': company.owner, 
     })) 
    except ObjectDoesNotExist: 
     messages.error(request, 'Failed to follow.') 

ответ

3

отправить по электронной почте каждый раз, когда число последователей для конкретной компании становится кратным 5, например, так:

if not (Follower.objects.filter(company=company).count() % 5): 
     #send the email 
+0

мне еще нужно будет создать список 5 последних последователей, да? – Modelesq

+0

Да, так же просто, как Follower.objects.filter (company = company) .order_by ('- created') [: 5], это даст вам последние 5, и вам ничего не нужно будет удалять. – thikonom

+0

Другой, более сложный вариант - использовать сигналы. Дайте мне знать, если вы хотите, чтобы я тоже написал это решение, если этот вам не подходит. – thikonom

Смежные вопросы