>我有一个模型,其中包含如下字段
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 的价格和名称。