使用 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
我有一个如下所示的模型。该模型具有属性 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