在 django 中使用聚合获取最小值字段名称



>我有一个模型,其中包含如下字段

class Choclate(models.Model):
    name = models.CharField(max_length=256)
    price = models.IntegerField()

所以我想获取具有lowest price值的字段名称,因此,为了获得lowest price值,我们可以使用以下Aggregations

from django.db.models import Avg, Max, Min
choclates = Choclate.objects.all()
lowest_price = choclates.aggregate(Min('price'))

那么最后如何获得与 django 中最低价格价值相关的field name

您可以尝试以下代码来获得您想要的确切内容

>>> from django.db.models import Min
>>> Choclate.objects.filter().values_list('name').annotate(Min('price')).order_by('price')[0]
(u'First1', 10)
>>>

First1是字段名称具有最低值price = 10

文档链接

如果将

Min作为位置参数传递,则字段的名称为 price__min 。否则,如果您将其作为关键字参数传递,即 aggregate(my_min=Min('price')) ,那么它将以与参数相同的名称提供,在本例中为 my_min 。文档

对于最小值和最大值,您可以对值进行排序(QuerySet 结果)并获取 first() 和 last():

chocolate_list = Chocolate.objects.values_list('name', 'price')
min = chocolate_list.order_by('price').first()
max = chocolate_list.order_by('price').last()

PS:删除过滤器() 如果你没有分配任何内容。使用 values_list() 隐式实例化 QuerySet 类

Gol@Maciej的用法:

from django.db.models import Min    
lowest_price = Chocolate.objects.values('price').aggregate(Min('price'))['price__min']

扩展Jcc的答案和Luciano的评论,确切OP问题的解决方案如下。

法典

cheapest_choclate = Choclate.objects.values_list('name', 'price').order_by('price')[0]
lowest_price = cheapest_choclate['price']
cheapest_choclate_name = cheapest_choclate['name']

解释

使用 Choclate.objects ,您可以从数据库中获取 Choclate 类的所有对象。

使用 .values_list('name', 'price') ,您可以创建一个带有元组列表的 QuerySet,其中每个元组包含每个对象的"名称"和"价格"——例如 [('Sweet', 79),('Bitter', 49), ('Spicy', 69)] .

使用 .order_by('price') ,您可以使用价格对列表中的元组进行排序 - 例如 [('Bitter', 49), ('Spicy', 69), ('Sweet', 79)] .

使用 [0] ,您可以从列表中选择第一个元组。此元组包含最便宜的choclate的名称和价格。您也可以按照 Jcc 的建议使用 .first()。但是,我更喜欢[0]方法,因为如果需要,它可以很容易地更改为其他东西 - 例如,可以使用[1]获得"第二便宜"的choclate。

最后,您可以使用 cheapest_choclate['price']cheapest_choclate['name'] 从第一个元组中获取最便宜的 choclate 的价格和名称。

最新更新