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

时间:2018-01-02 22:47:29

标签: python django django-queryset django-1.11

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

1 个答案:

答案 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