Django связанный вопрос запрос списка выигранных товаров путем получения списка товаров затем максимальная ставка из таблицы ставок для каждого товара затем проверка выиграл ли пользователь его

У меня есть вопрос, у меня есть две таблицы в моих моделях 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
})

спасибо заранее

Вы можете фильтровать Listing, сначала создав Subquery выражение [Django-doc], которое будет получать победителя, а затем проверять, является ли вошедший пользователь (или другой пользователь) победителем, таким образом:

from django.db.models import OuterRef, Subquery

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

или Listing, где у пользователя есть активная ставка:

Listing.objects.filter(
    bid__user=request.user,
    active=True
).distinct()
Вернуться на верх