python - Django结合3个查询集
问题描述
好朋友,我对将查询集组合成一个不是很熟悉。如何在不更改模板设计的情况下达到我想要的结果?
注意:我已经问过这个问题。我刚刚发现在 Django 中有组合多个查询集这样的东西。不过,这不是同一个问题。
这是我的views.py:
Markingbehaviors = StudentsBehaviorGrades.objects.filter(Teacher=teacher) \
.filter(Students_Enrollment_Records__in=Students.values_list('id')).values('Grading_Period').distinct('Grading_Period')\
.order_by('Grading_Period')
Marking = StudentsBehaviorGrades.objects.filter(Teacher=teacher) \
.filter(Students_Enrollment_Records__in=Students.values_list('id'))
cores = StudentsBehaviorGrades.objects.filter(Teacher=teacher) \
.filter(Students_Enrollment_Records__in=Students.values_list('id')).values(
'Marking__Marking',
'Grading_Behavior__Grading_Behavior__Name',
'Grading_Behavior__Grading_Behavior__GroupName').distinct(
'Grading_Behavior__Grading_Behavior__Name') \
.order_by('Grading_Behavior__Grading_Behavior__Name')
behaviors = StudentsBehaviorGrades.objects.filter(Teacher=teacher) \
.filter(Students_Enrollment_Records__in=Students.values_list('id')).values(
'Marking__Marking',
'Grading_Behavior__Grading_Behavior__Name',
'Grading_Behavior__Grading_Behavior__GroupName').distinct(
'Grading_Behavior__Grading_Behavior__GroupName') \
.order_by('Grading_Behavior__Grading_Behavior__GroupName')
matches = cores.union(Marking,behaviors)
这是我的html:
<tr>
{% for quarter in Markingbehaviors %}
td class="tdquarter">Q {{quarter.Grading_Period}}</td>
{% endfor %}
</tr>
{% for match in matches %}
<tr>
<td rowspan="2" colspan="4" class="tblcoretitle">{{match.Grading_Behavior__Grading_Behavior__Name}}</td>
</tr>
<tr>
<td colspan="4" class="tblcore">{{match.Grading_Behavior__Grading_Behavior__GroupName}}</td>
<td class="tblcore">{{match.Marking.Marking}}</td>
</tr>
{% endfor %}
这是我对StudentsBehaviorGrades的管理视图:
这是我目前的结果:
我想要结果:
更新
当我在我的views.py中尝试这个时:
matches = set(itertools.chain(cores, behaviors,Marking))
我收到了这个错误:
如果您有更好的解决方案或想法,请分享您的答案。
这就是我渲染的方式
Marking = StudentsBehaviorGrades.objects.filter(Teacher=teacher) \
.filter(Students_Enrollment_Records__in=Students.values_list('id'))\
.order_by('Grading_Behavior__Grading_Behavior__Name')
cores = StudentsBehaviorGrades.objects.filter(Teacher=teacher) \
.filter(Students_Enrollment_Records__in=Students.values_list('id')).values(
'id',
'Marking__Marking',
'Grading_Period',
'Grading_Behavior__Grading_Behavior__Name',
'Grading_Behavior__Grading_Behavior__GroupName').distinct(
'id',
'Grading_Behavior__Grading_Behavior__Name').order_by(
'id',
'Grading_Behavior__Grading_Behavior__Name'
)
behaviors = StudentsBehaviorGrades.objects.filter(Teacher=teacher) \
.filter(Students_Enrollment_Records__in=Students.values_list('id')).values(
'id',
'Marking__Marking',
'Grading_Period',
'Grading_Behavior__Grading_Behavior__Name',
'Grading_Behavior__Grading_Behavior__GroupName').distinct(
'id',
'Grading_Behavior__Grading_Behavior__GroupName').order_by(
'id',
'Grading_Behavior__Grading_Behavior__GroupName'
)
matches = cores.union(Marking,behaviors)
return render(request, 'Homepage/mystudentperreport.html',{ "matches":matches,})
解决方案
组合查询集非常简单。在组合相同的SOMTIMES时,您有两种选择。
深度模型只是原始的SQL语句,SQL 中的组合使用AND 或 OR 发生, 它们 存在于 python 中。有Q
用于更复杂查找的对象。让我们来看看。
如果您有 2 个或更多查询集。
您可以OR或AND它们,如果它们属于相同类型qs_3 = qs_1 & qs_2
,则将它们串联返回
与 相同|
,但是,您有不同的类型,这就是Q
对象存在的原因。
例如
from django.db.models import Q
my_concatenated_qs = Q(MyModel__my_attr_if_I_want="") & Q(MyAnotherModel)
|
也可以。
注意: MyModel、MyAnotherModel 不是模型实例,它只是名称,也不是字符串。只是没有引号的原始名称。
您也可以删除my_attr_if_I_want
,我只是想表明可以在__
此处使用该语法。
Q
对象不限于我展示的模型查询
例如
complex_queryset = MyModel.objects.filter(
Q(my_attr__startswith='R') & ~Q(my_another_attr__startswith='Z')
| Q(my_third_attr__startswith='R') & Q(my_fourth_attr__startswith='R')
)
您还可以否定查询集
例如
X = True
Y = not X
这是Negation,否定 Q 对象(不查询)
~Q(MyModel__startswith="A") | Q(MyModel__whatever__whatever=[])
此外,您可以在此处阅读有关 Q 对象的信息
推荐阅读
- node.js - 登录到生成和销毁多个子进程的项目中的单个文件?
- swift - 使用相同的个性化键盘填充不同的 UITextField
- maps - Google Places API 查找附近的地方
- javascript - Appendchild 仅适用于最后一个元素
- api - API Gateway POST 方法在测试期间有效,但不适用于邮递员
- java - 使用 Byte buddy 而不是 MethodDelegation 定义方法体
- c++ - OpenCV - 获取图像的一部分
- ios - 不能从 ... 向下转换为更可选的类型
- google-cloud-functions - 如何将多个服务帐户凭据分配给 Google Cloud Functions?
- r - 如何在 R 中做 SUMIFS