Django获取列表中每个值的最后一个对象

bn31dyow  于 2022-11-18  发布在  Go
关注(0)|答案(2)|浏览(199)

我有一个名为Purchase的模型,它有两个字段:Useramount_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()操作符,但它只返回一个对象。
这是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进行分组,然后获取最新的,但我想知道是否有一种方法可以将其作为对DB的单个查询。

3htmauhk

3htmauhk1#

试试这个:

Purchase.objects.filter(user__in=list_of_users).values("user_id", "amount_spent").order_by("-id").distinct("user_id")
mdfafbf1

mdfafbf12#

您可以使用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

相关问题