Helpex - Trao đổi & giúp đỡ Đăng nhập
3

Tôi đang cố gắng lấy một tổng đơn giản cho một cột có nhiều hàng trong bộ truy vấn. Câu hỏi trực tiếp của tôi là (a) làm cách nào để đặt get_queryset()bao gồm tổng của một cột và (b) làm cách nào để truy cập phần tử đó trong một mẫu? Sau câu hỏi này :

#models.py
class ItemPrice( models.Model ):
    price = models.DecimalField ( max_digits = 8, decimal_places=2 )
    ....

Có hai câu trả lời được cung cấp - một câu trả lời sử dụng .aggregate()phương thức mà tôi không tin sẽ trả về một tập truy vấn và .annotate()phương thức mà tôi tin rằng sẽ gắn một mục vào tập truy vấn.

Vì vậy, tôi đã mong đợi rằng phần sau sẽ thêm một mục khác vào danh sách đối tượng trong dạng xem này:

#views.py
def get_queryset(self):
    # generate table and filter down to a subquery.
    queryset = ItemPrice.objects.filter(<some_filter>)
    # sum the price for each row in the subquery.
    queryset = queryset.annotate(totals=Sum('price'))
    return queryset

Sau đó, trong Mẫu, tôi sẽ có thể lặp lại qua danh sách đối tượng như sau:

#template.html
{% for item in object_list %}
    {{ item }}
{% endfor %}

Với kỳ vọng rằng một trong các mục (mục cuối cùng?) Sẽ là price_sumvà số dư có thể được truy cập dưới dạng price_sum.price.

Tuy nhiên, khi tôi thêm phần sau vào mẫu của mình, tôi sẽ nhận được giá cho từng chi tiết đơn hàng - không có tổng kết.

{% for item in object_list %}
    {{ item.totals }}
{% endfor %}

Nhưng, tôi không thể truy cập mục này. Tôi không biết vấn đề là do sửa đổi chế độ xem của get_queryset()hoặc nếu nó nằm trong mẫu?

3 hữu ích 2 bình luận 9.2k xem chia sẻ
3

nếu bạn muốn thêm dữ liệu vào mẫu

queryset = ItemPrice.objects.filter(<your_filter>)
totals = queryset.aggregate(sum=Sum('price').get('sum')

context  = {
    'object_list': queryset,
    'totals': totals,
}
render(request, '<name_of_your_template>.html', context)

và trong mẫu của bạn

{% for item in object_list %}
    # price of item
    {{ item.price }}
{% endfor %}
# total price
{{ totals }}
3 hữu ích 1 bình luận chia sẻ
4

nếu bạn muốn sử dụng:

ItemPrice.objects.filter(<some_filter>).annotate(totals=Sum('price'))

tổng số luôn luôn giống như 'giá'

chú thích (về Sum) sử dụng như thế này:

nếu bạn có các mô hình này:

class ItemPrice( models.Model ):
    price = models.DecimalField ( max_digits = 8, decimal_places=2 )
    other_model = models.ForeignKey(
          to=OtherModel, 
          related_name="item_prices", 
          on_delete=models.SET_NULL
    )

# related_name - if I set related_name I can use like this
# other_model_object.item_prices.all() - this code return all 
# ItemPrices with other_model_id=other_model_object.id

class OtherModel(models.Model):
    some_field = models.CharField(max_lenght=256)

và bạn muốn tất cả giá của tất cả các ItemPrices có khóa ngoại cho một OtherModel, bạn nên sử dụng mã sau:

queryset = OtherModel.objects.annotate(
       total_prices=Sum('item_prices__price')
).filter(<your_filters>)

sau đó bạn có thể sử dụng:

for obj in queryset:
    print(obj.total_prices)

Hoặc nếu bạn cần tổng tất cả các mức giá, bạn nên sử dụng tổng hợp

ItemPrices.objects.aggregate(all_sum=Sum('price'))

mã này trả về dict (hoặc cái gì đó tương tự, tôi không nhớ chính xác) như thế này

{'all_sum': 1250}

all_sum - tổng tất cả các đối tượng trong bảng của bạn trong cơ sở dữ liệu

4 hữu ích 5 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ python django python-3.x , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading