(модель Django) Как работает эта модель сообщений?

Итак, я смотрю видео на Youtube о том, как создать приложение для общения в чате. Затем он создает модель, которую я не понимаю. Вот модель сообщения, с которой я столкнулся и не могу понять, как она работает

class Message(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user')
    sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='from_user')
    recipient = models.ForeignKey(User, on_delete=models.CASCADE, related_name='to_user')
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    is_read = models.BooleanField(default=False)

    def send_message(from_user, to_user, body):
        sender_message = Message(user=from_user, sender=from_user, recipient=to_user, body=body, is_read=True)
        sender_message.save()

        recipient_message = Message(user=to_user, sender=from_user, recipient=from_user, body=body, is_read=True)
        recipient_message.save()

        return sender_message

    def get_message(user):
        users = []
        messages = Message.objects.filter(user=user).values('recipient').annotate(last=Max('date')).order_by('-last')
        # filter by user=the login user, recipient=the sender, the lastest message from each sender, order the lastest message by sender using time

        for message in messages:
            users.append({
                'user': User.objects.get(pk=message['recipient']),
                'last': message['last'],
                'unread': Message.objects.filter(user=user, recipient__pk=message['recipient'], is_read=False).count(),
                })

        return users

Я понимаю различные поля модели Message, но не могу понять почему в функции send_message() создается два экземпляра модели сообщения. Один для сообщения отправителя и другой для сообщения получателя.

recipient_message = Message(user=to_user, sender=from_user, recipient=from_user, body=body, is_read=True)

Тогда для recipient_message я не понимаю, почему поле recipient установлено в from_user вместо to_user???

Может ли кто-нибудь помочь мне с этим?

Я в замешательстве, как работает эта модель сообщений.

Отвечая на ваш первый вопрос, две модели создаются потому, что ни одно из полей в модели не является уникальным, когда вы инстанцируете новый экземпляр класса Message, вы по существу инстанцируете две отдельные строки в таблице базы данных.

Неясно, почему поле user перевернуто, но, скорее всего, это сделано для того, чтобы пользователь мог сам фильтровать сообщения, хотя оба эти варианта являются плохой практикой.

Модель Message имеет поля для хранения информации о сообщении, включая отправителя и получателя (оба из которых являются внешними ключами для модели User), тело сообщения и дату отправки сообщения.

Модель также имеет два метода: send_message и get_message.

Метод send_message создает два экземпляра модели Message - один для отправителя и один для получателя. Он сохраняет оба экземпляра в базе данных и возвращает сообщение отправителя.

Метод get_message извлекает сообщения для определенного пользователя и возвращает список словарей, каждый из которых содержит информацию о получателе сообщения, дату последнего полученного сообщения и количество непрочитанных сообщений от этого получателя. Эта информация извлекается с помощью методов filter и annotate в Django ORM, которые позволяют гибко запрашивать базу данных и агрегировать данные.

Вернуться на верх