Здравствуйте!
Пытаясь сделать систему обмена сообщениями между пользователями (по типу как в ВК и прочих соц. сетях, только лайт-версию, без асинхронности и т.д.).
models.py
class Dialog(models.Model):
class Meta:
verbose_name = _('dialog')
verbose_name_plural = _('dialogs')
participants = models.ManyToManyField(User, verbose_name=_('participants'))
def __str__(self):
return _('Dialog #%s') % self.id
class Message(models.Model):
class Meta:
verbose_name = _('message')
verbose_name_plural = _('messages')
dialog = models.ForeignKey(Dialog, verbose_name=_('dialog'))
author = models.ForeignKey(User, verbose_name=_('author'))
txt = models.TextField(_('text of message'), blank=False)
created = models.DateTimeField(_('created'), auto_now_add=True)
deleted = models.BooleanField(_('deleted'), default=False)
def __str__(self):
return self.txt
Почти сразу столкнулся с проблемой.
views.py
def dialog_list(request):
user_id = request.user.id
dialogs = Dialog.objects.filter(participants=user_id)
# Кроме списка самих диалогов (не самое удачное название,
# но пусть пока будет так), надо ещё выбрать данные о
# последнем сообщении в диалоге.
return render_to_response('dialogs/dialog_list.html', locals())
Проблема описана в комментарии views.py. Не в сети, не в документации (хотя возможно, что что-то всё же пропустил) правильного и красивого решения не нашёл, по типу как нечто похожее есть с ForeignKey. Единственное, что приходит в голову... цикл. Но есть стойкое убеждение, что цикл породит большое количество запросов (при большом количестве диалогов), что не есть хорошо.
Собственно вопрос... Есть ли возможность с помощью Django ORM потянуть из базы не только список диалогов конкретного пользователя, но и данные о последнем сообщении в каждом диалоге, не используя цикл?