首页 > 解决方案 > 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,})

标签: pythondjango

解决方案


组合查询集非常简单。在组合相同的SOMTIMES时,您有两种选择。

深度模型只是原始的SQL语句,SQL 中的组合使用AND 或 OR 发生 它们 存在于 python 中。有Q用于更复杂查找的对象。让我们来看看。

如果您有 2 个或更多查询集。

您可以ORAND它们,如果它们属于相同类型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 对象的信息


推荐阅读