1+ from django .db .models import Count
12from django_filters import rest_framework as filters
23
34from projects .models import Project
@@ -11,16 +12,28 @@ class ProjectFilter(filters.FilterSet):
1112 Parameters to filter by:
1213 industry (int), step (int), region (str), name__contains (str),
1314 description__contains (str), collaborator__user__in (List[int]),
14- datetime_created__gt (datetime.datetime)
15+ datetime_created__gt (datetime.datetime), step (int), any_vacancies (bool),
16+ member_count__gt (int), member_count__lt (int), leader (int)
1517
1618 Examples:
1719 ?industry=1&name__contains=clown
1820 equals to .filter(industry=1, name__contains='clown')
1921 ?datetime_created__gt=25.10.2022
2022 equals to .filter(datetime_created__gt=datetime.datetime(...))
2123 ?collaborator__user__in=1,2 equals to .filter(collaborator__user__in=[1, 2])
24+ ?step=1 equals to .filter(step=1)
25+ ?any_vacancies=true equals to .filter(any_vacancies=True)
26+ ?collaborator__count__gt=1 equals to .filter(collaborator__count__gt=1)
2227 """
2328
29+ @classmethod
30+ def filter_collaborator_count_lt (cls , queryset , name , value ):
31+ return queryset .alias (Count ("collaborator" )).filter (collaborator__count__lt = value )
32+
33+ @classmethod
34+ def filter_collaborator_count_gt (cls , queryset , name , value ):
35+ return queryset .alias (Count ("collaborator" )).filter (collaborator__count__gt = value )
36+
2437 name__contains = filters .Filter (field_name = "name" , lookup_expr = "contains" )
2538 description__contains = filters .Filter (
2639 field_name = "description" , lookup_expr = "contains"
@@ -32,6 +45,18 @@ class ProjectFilter(filters.FilterSet):
3245 field_name = "datetime_created" , lookup_expr = "gt"
3346 )
3447
48+ # filters by whether there are any vacancies in the project
49+ any_vacancies = filters .BooleanFilter (
50+ field_name = "vacancies" , lookup_expr = "isnull" , exclude = True
51+ )
52+ collaborator__count__gt = filters .NumberFilter (
53+ field_name = "collaborator" , lookup_expr = "count__gt"
54+ )
55+ collaborator__count__lt = filters .NumberFilter (
56+ field_name = "collaborator" , method = "filter_collaborator_count_lt"
57+ )
58+ step = filters .NumberFilter (field_name = "step" )
59+
3560 class Meta :
3661 model = Project
37- fields = ("industry" , "step" , "region" , "leader" )
62+ fields = ("industry" , "step" , "region" , "leader" , "step" )
0 commit comments