使用 django-filters 创建自定义字段

Creating custom fields with django-filters

我有一个如下所示的模型。该模型具有属性 type 作为外键。

class YachtGeneralInfo(models.Model):
    type = models.ForeignKey(
        YachtTypes,
        related_name="yachts_in_type",
        on_delete=models.PROTECT,
        blank=False,
        null=False,
    )
    ....
    ....

我写了一个视图class是这样的-

class YachtGeneralInfoView(ListAPIView):

    pagination_class = PageNumberPagination
    serializer_class = YachtGeneralInfoSerializer
    filter_backends = [OrderingFilter, SearchFilter, DjangoFilterBackend]
    filterset_fields = [
        "status",
        "is_professional",
        "chartered_with__id",
        "harbour__id",
        "harbour__city__id",
        "model__id",
    ]
    search_fields = ["name", "company_name", "website", "owner__name"]

我想为字段 type 添加另一个过滤器。但是,我想为此查询参数提供多个值,例如 [1,2,3].

如果我直接用 queryset 这样做,那么它会像这样 -

queryset = YachtGeneralInfo.objects.filter(type__in=[1,2,3])

有没有一种方法可以编写自定义过滤器集字段来完成此操作,而不是直接将其放在查询集中?

您可以为类型 ID look-up 创建自定义过滤器集。

class YachtTypeFilterSet(django_filters.FilterSet):
    type_in = django_filters.CharFilter(
        method='filter_guest_level', field_name='guest_level')

    def filter_type_in(self, queryset, field_name, value):
        if value != "":
            id_array = json.loads(value)
            if isinstance(id_array, list):
                return queryset.filter(type__id__in=id_array)
        return queryset

然后您可以在视图中设置 class。

class YachtGeneralInfoView(ListAPIView):
    ...
    filterset_class = YachtTypeFilterSet