Đầu tiên, bạn phải tạo một Hàm có thể trích xuất tháng cho bạn:
from django.db import models
from django.db.models import Func
class Month(Func):
function = 'EXTRACT'
template = '%(function)s(MONTH from %(expressions)s)'
output_field = models.IntegerField()
Sau đó, tất cả những gì bạn cần làm là
- chú thích từng hàng bằng tháng
- nhóm các kết quả theo tháng được chú thích bằng cách sử dụng
values()
- chú thích từng kết quả bằng tổng được tổng hợp của các tổng bằng cách sử dụng
Sum()
Quan trọng :nếu lớp mô hình của bạn có thứ tự mặc định được chỉ định trong các tùy chọn meta, thì bạn sẽ phải thêm một order_by()
trống mệnh đề. Điều này là do https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#interaction-with-default-ordering-or-order-by
Các trường được đề cập trong
order_by()
một phần của bộ truy vấn (hoặc được sử dụng theo thứ tự mặc định trên một mô hình) được sử dụng khi chọn dữ liệu đầu ra, ngay cả khi chúng không được chỉ định khác trong các giá trịvalues()
gọi điện. Các trường bổ sung này được sử dụng để nhóm các kết quả “thích” lại với nhau và chúng có thể làm cho các hàng kết quả giống hệt nhau có vẻ tách biệt.
Nếu không chắc chắn, bạn có thể thêm order_by()
trống điều khoản nào mà không có bất kỳ tác dụng phụ nào.
tức là
from django.db.models import Sum
summary = (Invoice.objects
.annotate(m=Month('date'))
.values('m')
.annotate(total=Sum('total'))
.order_by())
Xem toàn bộ ý chính tại đây:https://gist.github.com/alvingonzales/ff9333e39d221981e5fc4cd6cdafdd17
Nếu bạn cần thêm thông tin:
Chi tiết về cách tạo các lớp Func của riêng bạn:https://docs.djangoproject.com/en/1.8/ref/models/expressions/#func-expressions
Thông tin chi tiết về mệnh đề giá trị (), (chú ý đến cách nó tương tác với annotate () theo thứ tự của các mệnh đề):https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values
thứ tự mà các mệnh đề annotate () và giá trị () được áp dụng cho một truy vấn là quan trọng. Nếu mệnh đề giá trị () đứng trước chú thích (), chú thích sẽ được tính bằng cách sử dụng nhóm được mô tả bởi mệnh đề giá trị ().