Отправить сообщение всем пользователям в Django
Я собирался создать функцию, которая посылает сообщение всем пользователям, используя forloop
.
но потом я подумал, что этот метод займет много времени в процессе, если членов много...
Поэтому я пришел спросить, есть ли какой-нибудь лучший метод, чтобы игнорировать forloop
и сгладить процесс.
Модель:
class TblExamNotification(models.Model):
exam = ForeignKey(TblExam,on_delete=models.CASCADE,blank=True, null=True)
user = ForeignKey(Members,on_delete=models.CASCADE,blank=True, null=True)
is_seen = BooleanField(default=False)
def __str__(self):
return str(self.id)
Просмотров:
for member in memebers.exclude(member = request.user):
notif_obj = Members.objects.create(user=member , exam=exam_obj)
notif_obj .save()
Сначала создайте список всех уведомлений, которые вы хотите использовать, затем сохраните их в массовом порядке с помощью bulk_create(…)
[Django-doc]:
items = [
TblExamNotification(user=member , exam=exam_obj)
for member in memebers.exclude(member=request.user)
]
TblExamNotification.objects.bulk_create(items)
Узким местом (очень) вероятно является не сам цикл for
, а тот факт, что вы использовали множество запросов к базе данных.
Проблема не в цикле for. Проблема в том, что вы делаете запрос к БД при каждом создании объекта Members.
Вы можете уменьшить количество просмотров, используя bulk create, который делает запрос только один раз для создания нескольких объектов.
Ref: Bulk create
member_objs = [Members(user=member, exam=exam_obj) for member in members.exclude(member=request.user)]
Members.objects.bulk_create(member_objs)