Django Rest Framework中使用通配符进行过滤



我正在寻找一种能够使用通配符在DRF中过滤数据集的方法。例如我想返回以下模型中以"gb"开头的任何主机名。根据使用情况,我还需要在主机名的中间和末尾进行搜索。

我希望能够访问以下端点:/devices/?host_name=gb*并且它返回所有以gb开头的hostname。

型号:

class Device(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
host_name = models.CharField(max_length=64)
mgmt_ip_address = models.GenericIPAddressField()
domain_name = models.CharField(max_length=64)
class Meta:
ordering = ['host_name']
def __str__(self):
return self.host_name

序列化程序:

class DeviceSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.ReadOnlyField()
class Meta:
model = Device
fields = '__all__'

视图:

class DeviceViewSet(viewsets.ModelViewSet):
permission_classes = (DjangoModelPermissions,)
queryset = Device.objects.all()
serializer_class = DeviceSerializer
filter_backends = [DjangoFilterBackend, filters.rest_framework.DjangoFilterBackend, drf_filters.SearchFilter]
filter_fields = ['id',
'host_name',
'mgmt_ip_address',
]

我尝试过创建自定义过滤器,但不确定这是正确的方法,因为我一直无法使其工作。

在host_name字段上使用Django startswitch。

class DeviceListView(ListAPIView):
permission_classes = (DjangoModelPermissions,)
api_view = ['GET', ]
serializer_class = DeviceSerializer
def get_queryset(self):
host_name = self.request.query_params.get("host_name", None)
return Device.objects.filter(host_name__startswith=host_name)

最新更新