Django get_queryset 过滤多个 select

Django get_queryset filtering with multiple select

我使用外键字段进行过滤,有两个搜索条件:OR 和 AND 以及多项选择。

forms.py

class EmployeeSkillFilter(forms.ModelForm):
    skills = forms.ModelMultipleChoiceField(queryset=Technology.objects.all(), )

    class Meta:
        model = Employee
        fields = ['skills']

templates.py

<form  method="get" enctype="multipart/form-data">
     {% csrf_token %}
    <input type="checkbox" name="and" value="AND"> Choice and<br>
    <input type="checkbox" name="or" value="OR"> Choice OR<br>

          {{ skill_filter }}
    <button  type="submit" class="btn btn-info" type="button">Go!</button>
</form>

views.py

class AccountList(AuthorizedMixin, ListView):

    model = Employee
    template_name = 'employee_list.html'

    def get_queryset(self, *args, **kwargs):
        condition_and = self.request.GET.get('and', None)
        condition_or = self.request.GET.get('or', None)
        skill = self.request.GET.get('skills', None)
        if condition_and and skill:
            object_list = self.model.objects.filter(skills__name_id=skill) ??????

        if condition_or and tech:
            object_list = self.model.objects.filter(
                Q(skills__name_id=skill) |
                Q(skills__name_id=skill)
            ) ?????
        else:
            object_list = self.model.objects.all()

我的网址看起来像

localhost://....or=OR&skills=5&skills=4&skills=3

问题是当我 select 表单中有多个对象时,我不知道如何将它们全部传递给条件

skills__name_id=skill 

使用__in lookup [Django-doc]查找,在逻辑的情况下,计算匹配数:

from django.db.models import <b>Count</b>

class AccountList(AuthorizedMixin, ListView):

    model = Employee
    template_name = 'employee_list.html'

    def get_queryset(self, *args, **kwargs):
        condition_and = self.request.GET.get('and', None)
        condition_or = self.request.GET.get('and', None)
        <b>skills</b> = self.request.GET.<b>getlist(</b>'skills'<b>)</b>
        if condition_and:
            object_list = self.model.objects.filter(
                skills__in=skills
            ).annotate(
                <b>nskills=Count('skills')</b>
            ).filter(
                <b>nskills=len(skills)</b>
            )
        elif condition_or:
            object_list = self.model.objects.filter(
                <b>skills__in=skills</b>
            ).distinct()
        else:
            object_list = self.model.objects.all()