Что делает функция в модели django?

Я написал эту функцию в django model, которая поможет отправлять и получать сообщения, но, честно говоря, я не понимаю, что именно делает код, потому что преподаватель учебника ничего не объяснил о коде, и вот уже несколько дней я пытаюсь понять, что делает код, но пока никаких решений. Я не хочу просто копировать и вставлять код из учебника, я хочу понять, что делает каждый код, поэтому я буду благодарен за любую помощь.

Код

def get_messages(user):
        messages = Message.objects.filter(user=user).values('recipient').annotate(last=Max('date')).order_by('-last')
        users = []
        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

завершить models.py

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(max_length=1000, blank=True, null=True)
    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,
            body=body,
            recipient=from_user,)
        recipient_message.save()
        return sender_message

    def get_messages(user):
        messages = Message.objects.filter(user=user).values('recipient').annotate(last=Max('date')).order_by('-last')
        users = []
        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

views.py, если необходимо

def Inbox(request):
    messages = Message.get_messages(user=request.user)
    active_direct = None
    directs = None

    if messages:
        message = messages[0]
        active_direct = message['user'].username
        directs = Message.objects.filter(user=request.user, recipient=message['user'])
        directs.update(is_read=True)
        for message in messages:
            if message['user'].username == active_direct:
                message['unread'] = 0

Message.objects.filter(user=user).values('recipient').annotate(last=Max('date')).order_by('-last')

Это позволит выбрать все сообщения для определенного пользователя, из объекта сообщения выбирается значение получателя и максимальная дата. В SQL это равнозначно следующему:

SELECT
    "messages"."recipient",
    MAX("messages"."date") AS "last"
FROM
    "messages"
WHERE
    "messages"."recipient" = x
GROUP BY
    "messages"."recipient",
    "messages"."date"
ORDER BY
    "messages"."date" DESC

Затем в цикле извлекаются объекты пользователя по значению получателя:

'user': User.objects.get(pk=message['recipient']),

Unread будет установлено количество сообщений, которые данный пользователь отправил данному получателю, но они все еще не прочитаны.

'unread': Message.objects.filter(user=user, recipient__pk=message['recipient'], is_read=False).count()

Совет: если у вас когда-нибудь будет запрос к django, вы можете просто вызвать SQL-запрос, сделав следующее: print(Message.objects.filter(...).query)

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