簡體   English   中英

Django 獲取列表中每個值的最后一個 Object

[英]Django Get Last Object for each Value in List

我有一個名為Purchase的 model,它有兩個字段, 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()運算符,但它只返回一個 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM