聚合Django模板中的相关整型字段值
我有一个与节点模型相关的模型聚合Django模板中的相关整型字段值,django,django-templates,django-related-manager,Django,Django Templates,Django Related Manager,我有一个与节点模型相关的模型 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) us
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
在模板中,当我查询节点对象的列表时,我希望聚合每个对象的“视图数”的值
我已经在我的模板中尝试过了
{% for tree in tree_result|slice:":14" %}
{% for view in tree.related_views.all %}
{{ view.views_count }}
{% endfor %}
{% endfor %}
我有当前树的所有相关count_视图,但我想做的是聚合相关字段的值,并在树的for循环_结果中显示它
有什么建议吗
编辑:
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(
total_views=Sum('related_views__views_count')
)
注意:请不要在模板中聚合。模板不是为实现业务逻辑而设计的。模板应仅包含“呈现逻辑”。通过使用注释,您可以让数据库进行聚合。数据库通常经过优化以执行此类任务
感谢您的回答,问题是,当我每次向模板中添加{{tree.total_views}}时,我在模板中的视图计数增加了4,因为实际上我有3个视图,并且在模板中是16@FarhaniWalid:您也可以在视图中更新此内容,如
tree.related\u views.update(视图计数=F(‘视图计数’)+1)
。也就是说,有副作用的属性可能不是最好的代码设计。db方面一切似乎都正常,增量+1正在工作,但在呈现的telmplate中,我有一个增量4,我已经添加了整个视图,可能问题就在那里?我会接受你的答案,我会为新的视图发布一个新的答案我面临的问题,无论如何谢谢你们
{% for tree in tree_result|slice:":14" %}
{{ tree.total_views }}
{% endfor %}