Django:交叉引用模型中的模型对象 - 最佳实践?

问题描述 投票:1回答:1

我现在正在进行一些"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,然后将消息持久保存到数据库中。

python django django-queryset django-1.11
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.