(Django模型)这个消息模型是如何工作的?

hec6srdp  于 2023-02-10  发布在  Go
关注(0)|答案(2)|浏览(120)

我在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??
有人能帮我一下吗?
我搞不清楚这个消息模型是如何工作的。

wlzqhblo

wlzqhblo1#

为了回答您的第一个问题,我们创建了两个模型,因为模型中的字段都不是唯一的,当您示例化Message类的新示例时,实际上是示例化数据库表中的两个单独的行。
目前还不清楚为什么user字段被翻转,但很可能这样做是为了让用户可以自己过滤消息,尽管这两种做法都不好。

svgewumm

svgewumm2#

Message模型具有用于存储消息相关信息的字段,包括sender和recipient(两者都是User模型的外键)、消息正文和消息发送日期。
该模型还有两种方法:发送消息和获取消息。
send_message方法创建Message模型的两个示例-一个用于发送者,另一个用于接收者。它将这两个示例保存到数据库并返回发送者的消息。
get_message方法检索特定用户的消息,并返回一个字典列表,每个字典包含消息接收者的信息,最后一条消息的接收日期,以及来自该接收者的未读消息的数量。这些信息是使用Django ORM的filter和annotate方法检索的,这些方法允许以灵活的方式查询数据库和聚合数据。

相关问题