在django queryset中获取反向相关模型字段的值
Getting value of field of a reverse related model in django queryset
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")
在这里,我得到的是用户最后一条消息的时间,但是第一条消息。
我认为您无法通过一次查询轻松完成。 This 看起来正是您要找的东西。
您可以编写一个自定义的原始 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)
我想我找到了答案。
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
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")
在这里,我得到的是用户最后一条消息的时间,但是第一条消息。
我认为您无法通过一次查询轻松完成。 This 看起来正是您要找的东西。
您可以编写一个自定义的原始 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)
我想我找到了答案。
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