我在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
??
有人能帮我一下吗?
我搞不清楚这个消息模型是如何工作的。
2条答案
按热度按时间wlzqhblo1#
为了回答您的第一个问题,我们创建了两个模型,因为模型中的字段都不是唯一的,当您示例化Message类的新示例时,实际上是示例化数据库表中的两个单独的行。
目前还不清楚为什么
user
字段被翻转,但很可能这样做是为了让用户可以自己过滤消息,尽管这两种做法都不好。svgewumm2#
Message模型具有用于存储消息相关信息的字段,包括sender和recipient(两者都是User模型的外键)、消息正文和消息发送日期。
该模型还有两种方法:发送消息和获取消息。
send_message方法创建Message模型的两个示例-一个用于发送者,另一个用于接收者。它将这两个示例保存到数据库并返回发送者的消息。
get_message方法检索特定用户的消息,并返回一个字典列表,每个字典包含消息接收者的信息,最后一条消息的接收日期,以及来自该接收者的未读消息的数量。这些信息是使用Django ORM的filter和annotate方法检索的,这些方法允许以灵活的方式查询数据库和聚合数据。