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

Django: Cross referencing Model objects within a model - best practise?

我目前正处于 "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 }} 创建时,消息模型的 "where" 字段已填充。我在客户端使用网络套接字连接将 "message" 传回网络套接字 consumer.py,然后将消息保存到数据库)。

如果您使用 切片 查询集 [:1] 您将获得一个包含 至多一个项目 的查询集,但不包含项目本身。您可以使用 [0] 获取第一项,或者 .first():

def last_activity(self):
    last_persisted_message = Messages.objects \
                                     .filter(where=self.slug) \
                                     .order_by('-sent_at') \
                                     <b>.first()</b>
    if last_persisted_message is not None:
        return last_persisted_message.sent_at

如果您使用 [0] 并且没有这样的项目,那么程序将引发一个 IndexError(因为没有索引为 0 的项目)。

万一没有这样的Messages对象(满足filter(..)),那么last_persisted_message就是None,所以你得想办法解决那个案子。在这种情况下,我们 return None