【问题标题】:(Django model) How does this Message model works?(Django 模型)这个 Message 模型是如何工作的?
【发布时间】:2023-02-09 16:27:17
【问题描述】:

所以我正在关注一个关于如何创建聊天应用程序的 Youtube 视频。然后它建立了一个我不明白的模型。这是我遇到的 Message 模型,无法理解它是如何工作的。

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??

谁能帮我解决这个问题?

我很困惑这个消息模型是如何工作的。

【问题讨论】:

    标签: python django django-models messaging


    【解决方案1】:

    因此,为了回答您的第一个问题,创建了两个模型,因为模型中的字段都不是唯一的,当您实例化 Message 类的新实例时,您实际上是在数据库表中实例化两个单独的行。

    目前还不清楚为什么 user 字段被翻转,但很可能这样做是为了让用户可以自己过滤消息,尽管这些都是不好的做法。

    【讨论】:

      【解决方案2】:

      Message 模型具有用于存储有关消息的信息的字段,包括发件人和收件人(两者都是 User 模型的外键)、消息正文和消息发送日期。

      该模型还有两个方法:send_message 和 get_message。

      send_message 方法创建了 Message 模型的两个实例——一个用于发送者,一个用于接收者。它将两个实例都保存到数据库中并返回发件人的消息。

      get_message 方法检索特定用户的消息并返回字典列表,每个字典包含有关消息收件人的信息、上次收到消息的日期以及来自该收件人的未读消息数。此信息是使用 Django ORM 的过滤器和注释方法检索的,这些方法允许以灵活的方式查询数据库和聚合数据。

      【讨论】:

        猜你喜欢
        • 2012-08-13
        • 2018-07-06
        • 1970-01-01
        • 2020-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-01
        • 2020-12-16
        相关资源
        最近更新 更多