Как мне создать запрос Django, который охватывает две таблицы?

#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