Я пытаюсь добавить функцию Twilio broadcast SMS в мое приложение Django, но не могу понять, как получить все номера телефонов из базы данных.

Я создал модель 'Post' в моем приложении django, которая загружает основную статью в базу данных. Я пытаюсь реализовать функцию, которая уведомляет пользователей о том, что новая статья была загружена через SMS, но это должно быть отправлено всем пользователям, которые зарегистрировали свой номер в базе данных (сохраненный в отдельной модели 'Profile').

Я добавил в модель функцию 'save', которая отправляет SMS, когда пост загружен:

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    detail_text = models.TextField(default='')

def __str__(self):
    return self.title

def get_absolute_url(self):
    return reverse('post-detail', kwargs={'pk': self.pk})

def save(self, *args, **kwargs):
    account_sid = settings.TWILIO_ACCOUNT_SID 
    auth_token = settings.TWILIO_AUTH_TOKEN 
    user_numbers = ''

    client = Client(account_sid, auth_token)

    message = client.messages.create(
                                  body= 'Hello, a new article is available from your 
                                  dashboard.',
                                  from_= settings.TWILIO_NUMBER,
                                  to = user_numbers         
    )

    print(message.sid)

    return super().save(*args, **kwargs)

Я заставил API работать с одним номером, жестко закодированным в приложении, но теперь хочу брать номера из базы данных и отправлять всем пользователям, зарегистрировавшим свой номер мобильного телефона.

Я пробовал использовать Profile.objects.get(phone_numbers), но это не сработало. Изучив документацию Twilio, я понял, что мне нужно сохранить номера в settings.py как массив и изменить код в функции 'save', чтобы запустить цикл for, который перебирает все номера в массиве и присваивает их переменной 'user_numbers', используя settings.USER_NUMBERS (например). Однако я совсем новичок в Python и Django и не знаю, как это сделать.

Пример Twilio:

def broadcast_sms(request):
    message_to_broadcast = ("Have you played the incredible TwilioQuest "
                                                "yet? Grab it here: https://www.twilio.com/quest")
    client = Client(settings.TWILIO_ACCOUNT_SID, settings.TWILIO_AUTH_TOKEN)
    for recipient in settings.SMS_BROADCAST_TO_NUMBERS:
        if recipient:
            client.messages.create(to=recipient,
                                   from_=settings.TWILIO_NUMBER,
                                   body=message_to_broadcast)
    return HttpResponse("messages sent!", 200)

Любая помощь будет очень признательна.

Некоторые соответствующие документы, которые я прочитал, включают в себя:

https://www.twilio.com/blog/broadcast-sms-text-messages-python-3-django

https://support.twilio.com/hc/en-us/articles/223181548-Can-I-set-up-one-API-call-to-send-messages-to-a-list-of-people-

Вы не указали свои модели, поэтому я предположу, что у вас есть модель Profile с полем phone_number. Используйте этот метод сохранения внутри вашего класса Post:

def save(self, *args, **kwargs):
    if not self.pk: # Only if the instance is being created the code is executed
        phone_numbers = [profile.phone_number for profile in Profile.objects.all()]

        account_sid = settings.TWILIO_ACCOUNT_SID 
        auth_token = settings.TWILIO_AUTH_TOKEN
        client = Client(account_sid, auth_token)
    
        for phone_number in phone_numbers:
            if phone_number:
                message = client.messages.create(body='Hello, a new article is available from your dashboard.', from=settings.TWILIO_NUMBER, to=phone_number)

    super().save(*args, **kwargs)
Вернуться на верх