django - 在django queryset中获取反向相关模型字段的值

标签 django django-models django-orm

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")

在这里,我得到的是用户的最后一条消息时间,但第一条消息。

最佳答案

我想我已经找到了答案。

qs = User.objects.annotate(
        last_message_time=Max("messages__created_at"),
        last_message_message=Subquery(
            Chat.objects.filter(user=OuterRef("id")).order_by("-created_at").values("message")[:1]
        )
     ).order_by("-last_message_time")

关于这个问题,我从这篇文章中得到了帮助! https://medium.com/@hansonkd/the-dramatic-benefits-of-django-subqueries-and-annotations-4195e0dafb16

关于django - 在django queryset中获取反向相关模型字段的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51458053/

相关文章:

python - Django 按日期返回对象注释组

python - Django:条件表达式

python - 创建 super 用户时出现 Django 错误,AttributeError : 'Manager' object has no attribute 'get_by_natural_key'

python - 使用 Django GraphQL JWT 和 Graphene Relay 进行身份验证和授权

python - 使用 ListView 计算对象

django - 如何将当前登录的用户指定为模型字段的默认值?

Django 2 模型 1 形式

python - Django ORM : get objects distinct on a column and ordered by another column

django - 始终为真 Q 对象

javascript - 删除隐藏字段后 Django 中发生 CSRF 错误