我现在正在进行一些"QuerySet' object has no attribute ''
<> app.models.DoesNotExist: Messages matching query does not exist
循环。
本质上,我试图在Room模型上定义“last_activity”,该模型引用与该房间相关联的最后一条消息的发送时间。这是我的尝试:
class Room(models.Model):
title = models.CharField(max_length=255)
staff = models.BooleanField(default=False)
slug = models.SlugField(max_length=250, default='')
banner = models.ImageField(storage=USER_UPLOAD_LOC, null=True, blank=True)
def last_activity(self):
last_persisted_message = Messages.objects.filter(where=self.title).order_by('-sent_at')[:1]
return last_persisted_message.sent_at
class Messages(models.Model):
room = models.ForeignKey(Room, on_delete=models.CASCADE)
where = models.CharField(max_length=255)
message = models.TextField(default='')
user = models.ForeignKey(settings.AUTH_USER_MODEL)
username_from = models.CharField(max_length=255)
username_to = models.CharField(max_length=255, default='all')
sent_at = models.DateTimeField(default=datetime.datetime.now)
我现在尝试了很多东西并引用了查询集文档,似乎没有任何工作。
我还可以确认,当{{room.title}}创建消息时,将填充消息模型的“where”字段。我正在客户端使用Web套接字连接将“消息”传递回websocket consumer.py,然后将消息持久保存到数据库中。
如果使用[:1]
对查询集进行切片,则将获得一个最多包含一个项目的查询集,但不包含项目本身。您可以使用[0]
获取第一个项目,或者,.first()
:
def last_activity(self):
last_persisted_message = Messages.objects \
.filter(where=self.slug) \
.order_by('-sent_at') \
.first()
if last_persisted_message is not None:
return last_persisted_message.sent_at
如果你使用[0]
并且没有这样的项目,那么程序将引发一个IndexError
(因为没有索引0的项目)。
如果没有这样的Messages
对象(满足filter(..)
),那么last_persisted_message
将是None
,所以你必须找到解决这种情况的方法。在这种情况下,我们返回None
。