python - 如何计算不同查询集中的匹配项
问题描述
在对所有模型进行搜索后,我想在我的模板中计算不同的查询集,但似乎不同的查询集在列表列表中。
我的视图功能:
class Search(ListView):
template_name='artdb/searchResult.html'
def get_queryset(self): # override get_queryset() has to have that name...
q=self.request.GET.get('seastr')
models=[Person,Activity,Member,Comment]
fields=[l._meta.fields for l in models]
res=[]
for i,j in enumerate(models):
sq=[Q(**{x.name + "__icontains" : q}) for x in fields[i] if not isinstance(x,ForeignKey)]
res+=[j.objects.filter(k) or None for k in sq]
res=[k for k in res if k]
if q:
return res
else:
return Person.objects.none() # SELECT ... WHERE headline ILIKE '%Lennon%';
def get_context_data(self,*args,**kwargs):
#q=self.request.GET.get('seastr')
context=super().get_context_data(*args,**kwargs)
context['member']=Member.objects.all()
return context
上下文字典:
{'page_obj': None, 'view': <artdb.views.Search object at 0x7f415ec88080>, 'is_paginated': False, 'object_list': [<QuerySet [<Person: David Bolander>, <Person: adam something>]>, <QuerySet [<Comment: david bolander comment>]>], 'member': <QuerySet [<Member: 2019-11-21>, <Member: 2020-02-10>]>, 'paginator': None}
我的模板:
{% extends "artdb/index.html" %}
{% block sr1 %}
<ul>
<a class="btn btn-light btn-outline-success my-2 my-sm-0" role="button" href="{% url 'artdb:search' %}">
Persons: {{object_list.count}}
</a>
<a class="btn btn-light btn-outline-success my-2 my-sm-0" role="button" href="{% url 'artdb:search' %}">
Activities: {{activity.count}}
</a>
<a class="btn btn-light btn-outline-success my-2 my-sm-0" role="button" href="{% url 'artdb:search' %}">
Members: {{member.count}}
</a>
<a class="btn btn-light btn-outline-success my-2 my-sm-0" role="button" href="{% url 'artdb:search' %}">
Comments: {{comment.count}}
</a>
<br></br>
</ul>
{% endblock sr1 %
从模板中可以看出,我想计算<a>
标记中的匹配项,但查询集被堆叠为上下文字典中的列表列表。例如,可以计算成员,因为它是后来添加的,并且不在列表列表中。我该如何解决?
解决方案
好的,我找到了解决方案。我在上下文字典中再次插入 object_list:
def get_context_data(self,*args,**kwargs):
context=super().get_context_data(*args,**kwargs)
c=context['object_list']
cname=[l.model.__name__ for l in c]
for l in zip(cname,c):
context[l[0].lower()]=l[1]
return context
这不是最优雅的解决方案,如果其他人有其他解决方案,请分享。
推荐阅读
- angular - Angular 发布请求并导航到新组件
- javascript - 从@input 值单击的所有复选框
- regex - 正则表达式在我的 bash 脚本中触发了一个“意想不到的令牌”,但我可以说它看起来不错。我究竟做错了什么?
- python - chrome 无法同时使用无头模式和 chrome 配置文件路径启动
- javascript - VUE NPM 导入包到所有其他文件
- qt - 为什么 qtcreator 不能运行这个?
- compare - Cognito - 重置密码检查以前的密码
- react-native - React native:组件没有从渲染中返回(UiKitten)
- mysql - 如何查看 MySQL 的 InnoDB 生成的 B-tree 索引结构?
- php - 使用 lrlaravel eloquent 为用户获取平均评分