【问题标题】:Get max value from a set of rows从一组行中获取最大值
【发布时间】:2021-03-01 22:42:01
【问题描述】:

这个问题与cs50课程的项目2有关,可以找到here

我查看了以下文档:

Django queryset API ref

Django making queries

另外,我还查看了汇总和注释。

我已经在模板文件中创建了表格,我认为这非常简单。缺少的列是我要填写的内容。下图

这些是我创建的模型

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)

这是我很长一段时间后最接近的地方。但我得到的结果只是数字 2。参考下面的图片

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

其中 'Cabinet' 是我创建的 Listing 对象。并对他们进行了两次出价。

所以问题是,我如何获得特定列表的最高出价(即本案例中的 110)? 使用 orm.我想如果我使用原始 sql 查询,我可以构建一个字典,将其发送到带有查询集的模板。然后在遍历查询集时,获取键的值,其中键是列表的名称或类似的内容。不,我想知道如何通过 ORM 做到这一点。

【问题讨论】:

  • 尝试时会发生什么:Bid.objects.filter(list_item__title='Cabinet').prefetch_related('list_item').aggregate(Max('bid'))
  • @RobL 谢谢,这太棒了!!!我得到了{'bid__max': 110},当我到达预取部分时,我已经脑死了……另外,是否可以编写一个查询来一次性获取完整的行?您可以将您的评论作为答案,如果您愿意,我可以将其标记为已接受。

标签: python django orm django-queryset django-aggregation


【解决方案1】:

这里是答案#1

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

当你尝试这个时会发生什么(抱歉,我没有这样的对象可以测试):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2011-10-04
    • 2022-11-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多