django 相关问题通过获取项目列表然后从每个项目的出价 table 中获取最高出价来查询获胜项目列表,然后检查用户是否赢得了它

django related question querying list of won items by getting list of items then max bid from bid table for each item then check if user won it

我有一个问题,我的 django 模型中有两个表,一个用于列表,一个用于投标

class Listing(models.Model):
class Meta:
    verbose_name_plural = 'Listing'
title = models.CharField(max_length=64)
description = models.TextField()
price = models.DecimalField(max_digits=5, decimal_places=2)
image = models.URLField(max_length=500, default='')
category = models.CharField(max_length=32)
created = models.CharField(max_length=32)
addedon = models.DateTimeField(auto_now_add=True)
active = models.BooleanField(default=True)

def __str__(self):
    return self.title


class Bid(models.Model):
class Meta:
    verbose_name_plural = 'Bid'

user = models.ForeignKey(User, on_delete=models.CASCADE)
item = models.ForeignKey(Listing, on_delete=models.CASCADE)
bid = models.DecimalField(max_digits=5, decimal_places=2)
created = models.DateTimeField(auto_now_add=True)
 

我想要的是显示一个页面,其中包含所有用户赢得的项目

 def won(request):
listing = Listing.objects.filter(active=False)

这里的问题是我如何制作所有列表,然后检查每个列表的最高出价,然后检查当前用户是否是获胜者并将其显示在模板中 won.html 喜欢 :

 getMaxBid = Bid.objects.filter(item_id=listing.id).aggregate(Max('bid'))
            maxBid = getMaxBid['bid__max']

然后如果用户是获胜者则显示它

return render(request, "auctions/won.html", {
    'listing': listing, 'active': False
})

提前致谢

您可以通过首先创建一个 Subquery expression [Django-doc] 来过滤 Listing,然后检查登录用户(或其他用户)是否是获胜者,因此:

from django.db.models import OuterRef, Subquery

listing = Listing.objects.alias(
    bid_winner=<strong>Subquery(</strong>
        Bid.objects.filter(item=OuterRef('pk'))<strong>.order_by('-bid')</strong>.values('user')
    <strong>)</strong>[:1]
).filter(
    active=False,
    <strong>bid_winner=request.user</strong>
)

Listings 其中用户有有效的出价:

Listing.objects.filter(
    <strong>bid__user=request.user</strong>,
    active=True
).distinct()