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)
我在 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)