Что делает функция в модели 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)