【问题标题】:Filtering with wildcards in Django Rest Framework在 Django Rest Framework 中使用通配符进行过滤
【发布时间】:2021-03-29 10:25:06
【问题描述】:

我正在寻找一种能够使用通配符在 DRF 中过滤我的数据集的方法。 例如;我想返回以下模型中以“gb”开头的任何主机名。我也有一些要求,根据用例在主机名的中间和结尾进行搜索。

我希望能够访问以下端点:/devices/?host_name=gb* 它返回所有主机名以 gb 开头的东西。

型号:

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',
                     ]

我尝试过创建自定义过滤器,但不确定这是正确的方法,因为我无法让它发挥作用。

【问题讨论】:

    标签: python django api rest django-rest-framework


    【解决方案1】:

    在 host_name 字段上使用 Django 开头。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-02
      • 2017-12-28
      • 2019-08-22
      • 2013-05-21
      • 2018-03-14
      • 1970-01-01
      • 2019-02-12
      • 1970-01-01
      相关资源
      最近更新 更多