name-andy
name-andy

Reputation: 483

Get max value from a set of rows

This question is in relation to project 2 of the cs50 course which can be found here

I have looked at the following documentation:

Django queryset API ref

Django making queries

Plus, I have also taken a look at the aggregate and annotate things.

I've created the table in the template file, which is pretty straight forward I think. The missing column is what I'm trying to fill. Image below

The page that the user would see

These are the models that I have created

class User(AbstractUser):
    pass

class Category(models.Model):
    category = models.CharField(max_length=50)

    def __str__(self):
        return self.category

class Listing(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    description = models.TextField()
    initial_bid = models.IntegerField()
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    date_created = models.DateField(auto_now=True)

    def __str__(self):
        return self.title

class Bid(models.Model):
    whoDidBid = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    list_item = models.ForeignKey(Listing, default=0, on_delete=models.CASCADE)
    bid = models.IntegerField()
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now=True)

    def __str__(self):
        return_string = '{0.whoDidBid} {0.list_item} {0.bid}'
        return return_string.format(self)

This is the closest I could come to after a very long time. But the result I get is just the number 2. Ref image below

Query result

Listing.objects.filter(title='Cabinet').aggregate(Max('bid'))

Where 'Cabinet' is a Listing object that I have created. And placed two bids on them.The two bids as seen in django admin

So the question is, how do I get the Maximum bid value(i.e. 110 for this case) for a particular listing? Using the orm. I think if I used a raw sql query, I could build a dict, send it to the template with the queryset. Then while looping through the queryset, get the value for the key, where the key is the name of the listing or something along those lines. Nah, I would like to know how to do this through the ORM please.

Upvotes: 0

Views: 1568

Answers (1)

Rob L
Rob L

Reputation: 3734

Here's answer #1

Bid.objects.filter(list_item__title='Cabinet').prefetch_related('list_item').aggregate(Max('bid'))

What happens when you try this (sorry, I don't have any objects like this to test on):

Bid.objects.values(list_item__title).prefetch_related('list_item').annotate(Max('bid'))

Upvotes: 1

Related Questions