[英]Django Get Last Object for each Value in List
我有一个名为Purchase
的 model,它有两个字段, User
和amount_spent
。
这是models.py
:
class Purchase(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
amount_spent = models.IntegerField()
created_at = models.DateTimeField(auto_now_add=True)
我想从用户列表中获取最后一次购买。 在views.py
上,我有一个包含一些User
对象的列表,我想获取列表中每个用户的最后一次购买。 我找不到在单个查询中执行此操作的方法,我检查了QuerySets上的latest()运算符,但它只返回一个 object。
这是views.py
:
purchases = Purchase.objects.filter(user__in=list_of_users)
# purchases contains all the purchases from users, now I need to get the most recent onces for each user.
我现在可以按用户对purchases
进行分组,然后获取最新的购买,但我想知道是否有一种方法可以将其作为对数据库的单个查询。
尝试这个:
Purchase.objects.filter(user__in=list_of_users).values("user_id", "amount_spent").order_by("-id").distinct("user_id")
您可以使用last_purchase_pk
注释User
,然后获取这些并将其添加到这些用户:
from django.db.models import OuterRef, Subquery
users = User.objects.annotate(
last_purchase_pk=Subquery(
purchase.objects.order_by('-created_at')
.filter(user_id=OuterRef('pk'))
.values('pk')[:1]
)
)
purchases = {
p.pk: p
for p in Purchase.objects.filter(
pk__in=[user.last_purchase_pk for user in users]
)
}
for user in users:
user.last_purchase = purchases.get(user.last_purchase_pk)
在此代码片段之后, users
中的User
对象都将具有last_purchase
属性,其中包含该用户的最后一次Purchase
,如果没有此类购买,则为None
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.