#python #django
#python #django
Вопрос:
Я пытаюсь написать запрос, результатом которого был бы запрос, QuerySet
содержащий все title
значения из таблицы Listing, связанные с максимальными value
значениями для каждого из bid
значений в Bids
таблице.
class Listing(models.Model):
title = models.CharField(max_length=64)
description = models.TextField()
starting_bid = models.DecimalField(max_digits=10, decimal_places=2)
image = models.URLField()
category = models.CharField(max_length=64)
user = models.ForeignKey(User, on_delete=models.CASCADE, default=0)
is_active = models.BooleanField(default=True)
class Bids(models.Model):
bid = models.ForeignKey(Listing, on_delete=models.CASCADE, related_name="listing_bids")
value = models.DecimalField(max_digits=10, decimal_places=2, default=0)
user = models.ForeignKey(User, on_delete=models.CASCADE, default=0)
Мой идеальный результат был бы чем-то вроде <QuerySet: ['('Cat': '3')......]>
У меня есть запрос Django, который вернет единственное значение, если вы передадите одно название, и я могу получить список названий, но, похоже, я не могу передать этот список названий в него без получения ошибки.
Bids.objects.all().filter(bid=Listing.objects.get(title=title)).aggregate(Max("value"))
Следующее возвращает желаемый результат, но, как я уже сказал, это некрасиво и не использует возможности запросов Django…Я не думаю, но я могу ошибаться!
test_list = []
test = Bids.objects.all().values_list("bid_id", flat=True).distinct()
for k in test:
test_list.append(Bids.objects.all().filter(bid_id=k).aggregate(Max("value")))
title_list = Listing.objects.all().values_list("title", flat=True)
test_zip = dict(zip(title_list, test_list))
Есть идеи? Рад прояснить что-либо.
Ответ №1:
Вы можете использовать annotate
с Max
:
Listing.objects.annotate(Max('listing_bids__value'))
И тогда каждый список будет иметь атрибут listing_bids__value__max
Комментарии:
1. Я не уверен, почему, но это возвращает список запросов с результатами из записи в листинге. <Набор запросов [<Список: Cat, 2.00, img.webmd.com/dtmcms/live/webmd/consumer_assets/site_images /… >, <Список: Raccoon, 5.00, curiodyssey.org/wp-content/uploads/bb-plugin/cache /… >, <Список: Dog, 2.00, ]» rel=»nofollow noreferrer»> s3.amazonaws.com/cdn-origin-etr.akc.org/wp-content/uploads/2019 /… > который является заголовком, начальной ставкой, изображением.
2. Это то, что вы хотите, затем вы можете выполнить итерацию по нему и получить значения
title
иlisting_bids__value__max
3. о, так что в шаблоне я могу использовать {{title. перечисление_ставок_значения__max}}?
4. Я присвоил запросу, который вы написали, значение x, передал значение в шаблон, а затем попробовал {% для k в x%} {{k.listing_bids_value__max}} {% endfor%} ничего не отобразил. Возможно, я не понимаю, как выполнить итерацию по этому конкретному результату запроса?
5. Это потому, что между
bids
и должно быть два подчеркиванияvalue