在Django查询集中获取反向关联模型的字段值

3
class User(models.Model):
    name = models.CharField(max_length=189)

class Chat(models.Model):
    message = models.TextField()
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="messages")
    created_at = models.DateTimeField(auto_now_add=True)

这里我想做的是获取一个用户查询集,按照他们最后一条信息的时间排序,并且还需要包含用户的最后一条消息作为额外数据。
我已经尝试了以下方法。
qs = User.objects.annotate(
        last_message_time=Max("messages__created_at"),
        last_message=F("messages__message")
     ).order_by("-last_message_time")

我在这里获取的是用户的最新消息时间,而不是第一条消息。

2个回答

3

1
我不认为你可以轻松地用一个查询完成。这个看起来正是你要找的。
你可以编写自定义的原始SQL查询以获取所需内容,或者进行效率低下的两步操作:
qs = User.objects.annotate(
       last_message_time=Max("messages__created_at"),
    ).order_by("-last_message_time")

for user in qs:
    user.last_message = Chat.objects.get(user=user, created_at=user.last_message_time)

其实我想我已经在一个查询中解决了它。需要在 annotate 中使用子查询! - Mehran
1
不错!在回答之前,我实际上找到了同样的页面,但不确定它是否有效。关键是使用了 OuterRef("id") - Cyrlop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接