簡體   English   中英

Django get_queryset 過濾多選

[英]Django get_queryset filtering with multiple select

我使用兩個搜索條件按外鍵字段進行過濾:OR 和 AND 以及多項選擇。

表格.py

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

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

模板.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>

視圖.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

問題是當我在一個表單中選擇多個對象時,我不知道如何將它們全部傳遞給條件

skills__name_id=skill 

使用__in查找 [Django-doc]查找,並在邏輯的情況下,計算匹配的數量:

from django.db.models import Count

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)
        skills = self.request.GET.getlist('skills')
        if condition_and:
            object_list = self.model.objects.filter(
                skills__in=skills
            ).annotate(
                nskills=Count('skills')
            ).filter(
                nskills=len(skills)
            )
        elif condition_or:
            object_list = self.model.objects.filter(
                skills__in=skills
            ).distinct()
        else:
            object_list = self.model.objects.all()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM