如何使用django queryset获取一个月中每天的最大值



假设我有Model,Products和100k记录。现在我想通过一个月的2022-01-01,并获得该月每天的maximum价格。

产品型号

id     price     date
1.     33.33     2022-01-01
2.     93.33     2022-01-01
3.     64.33     2022-01-02
4.     34.33     2022-01-02
.
.
.
101.   43.33     2022-01-29
102.   74.33     2022-01-30
103.   36.33     2022-01-30

预期结果

93.33
64.33
.
.
.
43.33
74.33

对不起,我无法用更好的方式解释。

注意我只想要queryset。请尽量避免循环。

你可以这样做:

from django.db.models import Max
Product.objects.filter(
my_date__year="2022", my_date__month="01"
).values('my_date').annotate(
max_price=Max("price")
).order_by()

但我建议在处理大型数据集时执行原始查询,因为它们的工作速度更快:

max_product_query = """
SELECT id, MAX(price), my_date FROM your_app_product 
WHERE strftime("%Y-%m", my_date) = '{0}' GROUP BY my_date;
""".format(year_month)
products = Product.objects.raw(max_product_query)
for product in products:
# do something with the product

上面的查询是针对sqlite的mysql和postgres使用如下:

max_product_query = """
SELECT id, MAX(price), my_date FROM your_app_product 
WHERE EXTRACT(YEAR_MONTH FROM my_date) = '{0}' GROUP BY my_date';
""".format(year_month)

您可以查询对象,并使用以下查询注释每天的最大值:

from django.db.models import Max
Product.objects.filter(
valuta_date__gte="startdate", valuta_date__lt="enddate"
).values("date").order_by("date").annotate(Max("price"))

最新更新