在 Django 模板中聚合相关的整数字段值
Aggregate related integer-field values in Django template
我有这个与节点模型相关的模型,
class Views(models.Model):
related_tree = models.ForeignKey(Node, on_delete=models.CASCADE, blank=True, null=True, related_name='related_views')
views_count = models.PositiveIntegerField(null=True, blank=True, default=0)
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return self.related_tree.name
在模板中,当我查询节点对象列表时,我想聚合每个对象的 'views_count' 的值。
我已经在我的模板中试过了
{% for tree in tree_result|slice:":14" %}
{% for view in tree.related_views.all %}
{{ view.views_count }}
{% endfor %}
{% endfor %}
我有当前树的所有相关 count_view 但我想做的是聚合相关字段的值并在 tree_result.[= 的 for 循环中显示它13=]
有什么建议吗?
编辑:
def ResultSearch(request, search):
formatted_search = search.split('+$')
filter = Q()
cases = {}
get_result_list = [x for x in search.split('+$') if x != '']
for i, keyword in enumerate(get_result_list):
filter |= Q(name__icontains=keyword)
filter |= Q(Tags__icontains=keyword)
cases['keyword_match_{}'.format(i)] = Case(
When(name__icontains=keyword, then=1),
default=Value(0),
output_field=models.IntegerField(),
)
result = Node.objects.filter(
filter,
tree_type='root',
published=True,
tunisia_office=True
).annotate(
**cases
).annotate(
total_views=Sum('related_views__views_count'),
num_bookmarks=Count('bookmarked_by'),
keywords_matched=reduce(add, (F(name) for name in cases))
).order_by('-keywords_matched', '-num_bookmarks')
context = {
'searched_keyword': formatted_search,
'result_list': result,
}
您应该在视图中注释您的查询集,例如:
from django.db.models import Sum
Node.objects.annotate(
<b>total_views=Sum('related_views__views_count')</b>
)
从这个查询集产生的 Node
将有一个额外的属性 .total_views
,它是相关 Views
.[=17 的 views_count
的总和=]
在您的模板中,您可以将其呈现为:
{% for tree in tree_result|slice:":14" %}
{{ tree<b>.total_views</b> }}
{% endfor %}
Note: please do not aggregate in the template. Templates are not designed to implement business logic. A template should only contain "render logic". By using annotations, you will let the database do the aggregations. Databases are usually optimized to perform such tasks.
我有这个与节点模型相关的模型,
class Views(models.Model):
related_tree = models.ForeignKey(Node, on_delete=models.CASCADE, blank=True, null=True, related_name='related_views')
views_count = models.PositiveIntegerField(null=True, blank=True, default=0)
user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, blank=True, null=True)
def __str__(self):
return self.related_tree.name
在模板中,当我查询节点对象列表时,我想聚合每个对象的 'views_count' 的值。
我已经在我的模板中试过了
{% for tree in tree_result|slice:":14" %}
{% for view in tree.related_views.all %}
{{ view.views_count }}
{% endfor %}
{% endfor %}
我有当前树的所有相关 count_view 但我想做的是聚合相关字段的值并在 tree_result.[= 的 for 循环中显示它13=]
有什么建议吗?
编辑:
def ResultSearch(request, search):
formatted_search = search.split('+$')
filter = Q()
cases = {}
get_result_list = [x for x in search.split('+$') if x != '']
for i, keyword in enumerate(get_result_list):
filter |= Q(name__icontains=keyword)
filter |= Q(Tags__icontains=keyword)
cases['keyword_match_{}'.format(i)] = Case(
When(name__icontains=keyword, then=1),
default=Value(0),
output_field=models.IntegerField(),
)
result = Node.objects.filter(
filter,
tree_type='root',
published=True,
tunisia_office=True
).annotate(
**cases
).annotate(
total_views=Sum('related_views__views_count'),
num_bookmarks=Count('bookmarked_by'),
keywords_matched=reduce(add, (F(name) for name in cases))
).order_by('-keywords_matched', '-num_bookmarks')
context = {
'searched_keyword': formatted_search,
'result_list': result,
}
您应该在视图中注释您的查询集,例如:
from django.db.models import Sum
Node.objects.annotate(
<b>total_views=Sum('related_views__views_count')</b>
)
从这个查询集产生的 Node
将有一个额外的属性 .total_views
,它是相关 Views
.[=17 的 views_count
的总和=]
在您的模板中,您可以将其呈现为:
{% for tree in tree_result|slice:":14" %}
{{ tree<b>.total_views</b> }}
{% endfor %}
Note: please do not aggregate in the template. Templates are not designed to implement business logic. A template should only contain "render logic". By using annotations, you will let the database do the aggregations. Databases are usually optimized to perform such tasks.