在 Django 上用一个 SQL 请求列出用户及其最后一篇文章
Listing users with their last article with one SQL request on Django
class User(models.Model):
name = models.CharField(max_length=255)
class Article(models.Model):
user = models.ForeignKey(User)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
我需要列出所有用户及其上一篇文章。如何通过 一个数据库请求 获取它们?
# Something like:
{% for user in users %}:
{{ user.full_name }}: {{ user.last_message }}
{% endfor %}
- 李四:病人应该好好治疗,他会跟着医生
- Jake Carr:拥有一支优秀的球队很重要,接下来就是教练组。
- Malcolm Gordon:重要的是病人就是病人,教育是遵循
- 进入Ameter:患者应该得到很好的治疗,减肥精英会随之而来。
这是您的查询:
from django.db.models import OuterRef, Subquery
latest = Article.objects.filter(
user=OuterRef('pk')
).order_by('-created_at')
users = User.objects.annotate(
last_message=Subquery(latest.values("content")[:1])
)
for user in users:
print(user.username, user.last_message)
它为您提供用户最后的文章。
P.s: 它只会执行一个查询。
class User(models.Model):
name = models.CharField(max_length=255)
class Article(models.Model):
user = models.ForeignKey(User)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
我需要列出所有用户及其上一篇文章。如何通过 一个数据库请求 获取它们?
# Something like:
{% for user in users %}:
{{ user.full_name }}: {{ user.last_message }}
{% endfor %}
- 李四:病人应该好好治疗,他会跟着医生
- Jake Carr:拥有一支优秀的球队很重要,接下来就是教练组。
- Malcolm Gordon:重要的是病人就是病人,教育是遵循
- 进入Ameter:患者应该得到很好的治疗,减肥精英会随之而来。
这是您的查询:
from django.db.models import OuterRef, Subquery
latest = Article.objects.filter(
user=OuterRef('pk')
).order_by('-created_at')
users = User.objects.annotate(
last_message=Subquery(latest.values("content")[:1])
)
for user in users:
print(user.username, user.last_message)
它为您提供用户最后的文章。
P.s: 它只会执行一个查询。