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()