代码之家  ›  专栏  ›  技术社区  ›  rowsen

Django通过两个字段排列进行过滤

  •  1
  • rowsen  · 技术社区  · 10 月前

    我有一个包含两个字段的模型: min_age , max_age 。我需要用Django Filters按两个字段的范围进行过滤。我该怎么做?

    # models.py
    
    class AdvertisementModelMixin(models.Model):
        min_age = models.PositiveSmallIntegerField(
            blank=True,
            null=True,
            validators=[
                MaxValueValidator(80)
            ]
        )
        max_age = models.PositiveSmallIntegerField(
            blank=True,
            null=True,
            validators=[
                MaxValueValidator(80)
            ]
        )
    
    1 回复  |  直到 10 月前
        1
  •  1
  •   willeM_ Van Onsem    10 月前

    您可以使用以下内容创建自定义筛选器:

    from django_filters import FilterSet, NumberFilter
    
    
    class MyFilterSet(FilterSet):
        user_age = NumberFilter(field_name='user_age', method='filter_user_age')
    
        def filter_user_age(self, queryset, name, value):
            return queryset.objects.filter(min_age__lte=value, max_age__gte=value)

    或对于可为null的:

    from django.db.models import Q
    from django_filters import FilterSet, NumberFilter
    
    
    class MyFilterSet(FilterSet):
        user_age = NumberFilter(field_name='user_age', method='filter_user_age')
    
        def filter_user_age(self, queryset, name, value):
            return queryset.objects.filter(
                Q(min_age=None) | Q(min_age__lte=value),
                Q(max_age=None) | Q(max_age__gte=value),
            )