2012-02-28 17 views
5

क्या टेम्पलेट्स में क्वेरीसेट पर एनोटेटेड मानों तक पहुंच बनाना संभव है?Django टेम्पलेट में मूल्य एनोटेटेड

उदाहरण के लिए मेरे पास है निम्नलिखित क्वेरीसमूह है कि मैं अपने टेम्पलेट में गुजर रही है:

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

मेरे टेम्पलेट में मैं दृश्य इस तरह गिनती पाने के लिए कोशिश कर रहा हूँ:

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

कौन सा कुछ भी प्रदर्शित नहीं करता है।

लेकिन अगर मैं का उपयोग करें:

{{ video.views.count }} 

यह ठीक लग रहा है - लेकिन मेरा मानना ​​है दूसरा विकल्प देखे जाने की संख्या पुनर्गणना। मैं एनोटेटेड वैल्यू का उपयोग करना चाहता हूं क्योंकि इसकी गणना पहले से ही की जानी चाहिए।

+0

चाहिए नहीं इस "संदर्भ [वीडियो] = Videos.objects के विपरीत है। एनोटेट (view_count = गणना (विचार))। order_by (view_count) [: 100] "होना" संदर्भ ['वीडियो'] = Videos.objects.annotate (view_count = गणना ('विचार')) order_by ('view_count') [: 100] "कृपया अपना वास्तविक कोड पोस्ट करें और सहायता प्राप्त करने का मौका न चूकें – jpic

उत्तर

2

यह मतलब होता है कि QuerySet aggregation method per-item, annotate(), क्योंकि इस तरह के एक नाम यह (सेट) प्रत्येक आइटम (मॉडल उदाहरण) के लिए सकल मूल्य यह पैदावार, एक सामान्य क्षेत्र तरह annotates, उदाहरण के लिए:

# 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 

नाम के बारे में:

एनोटेशन के लिए नाम स्वचालित रूप से कुल के नाम से ली गई है समारोह और क्षेत्र का नाम समेकित किया जा रहा है। का उपयोग कर

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

कौन सा should be the same as:

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

आप इस्तेमाल कर सकते हैं: के साथ उदाहरण के लिए

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

: जब आप एनोटेशन निर्दिष्ट आप एक उपनाम प्रदान करके इस डिफ़ॉल्ट नाम ओवरराइड कर सकते हैं values_list():

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

और के समान:

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

जिसके अनुसार, सामान्य क्षेत्रों, the order in which filters are applied matters, तो आपको सचेत किया गया है बी)

संबंधित मुद्दे