2012-02-28 33 views
5

Có thể truy cập các giá trị được chú thích trên bộ truy vấn trong các mẫu không?Giá trị chú thích Django trong mẫu

Ví dụ tôi có queryset sau đó tôi đang đi qua để mẫu của tôi:

context[videos] = Videos.objects.annotate(view_count=Count(views)).order_by(view_count)[:100] 

Trong mẫu của tôi, tôi đang cố gắng để có được cái nhìn đếm như thế này:

{% for video in videos %} 
    {{ video.view_count }} 
{% endfor %} 

nào không hiển thị gì cả.

Tuy nhiên nếu tôi sử dụng:

{{ video.views.count }} 

Nó có vẻ tốt đẹp - nhưng tôi tin rằng tùy chọn thứ hai sẽ tính toán lại số lượt xem. Tôi muốn sử dụng giá trị chú thích vì nó đã được tính toán.

+0

nên không này "bối cảnh [video] = Videos.objects. chú thích (view_count = Count (views)) order_by (view_count) [: 100] "be" context ['videos'] = Videos.objects.annotate (view_count = Count ('views')). order_by ('view_count') [: 100] "Hãy đăng mã thực tế của bạn và đừng bỏ lỡ cơ hội nhận trợ giúp – jpic

Trả lời

2

Nó sẽ làm cho cảm giác rằng QuerySet aggregation method per-item, annotate(), có như vậy một tên vì nó annotates (bộ) giá trị tổng hợp để mỗi mục (ví dụ mô hình) nó mang lại, như một lĩnh vực bình thường, ví dụ:

# Build an annotated queryset 
>>> q = Book.objects.annotate(Count('authors')) 
# Interrogate the first object in the queryset 
>>> q[0] 
<Book: The Definitive Guide to Django> 
>>> q[0].authors__count 
2 
# Interrogate the second object in the queryset 
>>> q[1] 
<Book: Practical Django Projects> 
>>> q[1].authors__count 
1 

về tên:

tên cho chú thích được tự động lấy từ tên của tổng chức năng và tên của trường được tổng hợp. Bạn có thể ghi đè lên tên mặc định này bằng cách cung cấp một bí danh khi bạn chỉ định các chú thích:

>>> q = Book.objects.annotate(num_authors=Count('authors')) 
>>> q[0].num_authors 
2 
>>> q[1].num_authors 
1 

Ví dụ với:

context['videos'] = Videos.objects.annotate(view_count=Count('views')).order_by('-view_count')[100:] 

Bạn có thể sử dụng:

[video.view_count for video in context['videos']] 

nào should be the same as sử dụng values_list():

Videos.objects.annotate(view_count=Count('views')).values_list('view_count', flat=True) 

Và tương tự như:

{% for video in videos %} 
    {{ video.view_count }} 
{% endfor %} 

Điều đó nói rằng, không giống như các lĩnh vực bình thường, the order in which filters are applied matters, bạn đã được cảnh báo B)

Các vấn đề liên quan