我目前正在进行一些"QuerySet' object has no attribute ''
<> app.models.DoesNotExist: Messages matching query does not exist
循环。
基本上,我试图定义" 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}}创建消息时,将填充消息模型的字段。我在客户端使用Web套接字连接来传递"消息"返回websocket consumer.py然后将消息持久保存到数据库中。
答案 0 :(得分:1)
如果您使用[: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
。