Django 模型中的函数有什么作用?

What does a function in a django model do?

我在 django 模型中编写了这个函数,它可以帮助发送和接收消息,但是我不明白代码到底做了什么,因为教程老师没有解释任何关于代码的内容,现在我一直在尝试弄清楚代码在没有解决方案的情况下做了什么。 我不只是想复制和粘贴教程中的代码,我还想了解每个代码的作用,所以我会很感激任何帮助。

代码

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')

这将 select 特定用户的所有消息,您正在 selecting 收件人值和最大日期的那些消息对象。这等于 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': Message.objects.filter(user=user, recipient__pk=message['recipient'], is_read=False).count()

提示:如果您曾经有过 django 查询,您可以通过执行以下操作调用查看 SQL 查询:print(Message.objects.filter(...).query)