即使在 url 路径和 drf UI 中应用搜索过滤器后,Django 过滤器也不起作用

Django filter is not working even after search filter is applied in the url path and also in drf UI

这是我的代码:

models.py

class StoreLists(models.Model):
    id = models.AutoField(primary_key=True)
    store_name_ = models.CharField(max_length=300,unique=True)
    brand = models.CharField(max_length=300)

    class Meta:
        managed = False
        db_table = 'stores'

serializers.py

class StoreListSerializer(serializers.ModelSerializer):
    class Meta:
        model = StoreLists
        fields = "__all__"

views.py

class StoreListView(generics.GenericAPIView): # even tried with viewsets and ListModelView
    serializer_class = StoreListSerializer
    queryset = StoreLists.objects.all()
    filter_backends = (DjangoFilterBackend,)
    filterset_fields = ("store_name", "brand")

    def get(self, request):
        sales = self.filter_queryset(self.get_queryset())
        serializer = self.serializer_class(instance=sales, many=True)
        return Response(data=serializer.data, status=status.HTTP_200_OK)

urls.py

GET - http://127.0.0.1:8000/api/v1/store_list - getting all data

GET - http://127.0.0.1:8000/api/v1/store_list?brand=samplebrand  - getting all data (filter is not working, same with search filter)

甚至在应用程序中添加了 django_filters 并且还在 postman 和 drf 中尝试过 UI 但无法过滤。`

当您使用 django-filters 时,您应该按照以下步骤操作。 我在我的项目中遵循了这些步骤

#settings.py
  #...
  INSTALLED_APPS += ["django_filters"]
  REST_FRAMEWORK["DEFAULT_FILTER_BACKENDS"]=[
        "django_filters.rest_framework.DjangoFilterBackend",
        "rest_framework.filters.OrderingFilter",
    ]
  #...

#views.py
class TableMetaView(ModelViewSet):

serializer_class = TableMetaSerializer
queryset = TableMeta.objects.all()
renderer_classes = [JSONRenderer]
filterset_class = TableFilter
ordering_fields = ["created_on", "modified_on"]
ordering = ["id", "-modified_on"]

permission_classes = [
    UserHasDatasetChangeAccess & IsTableEditable,
]

def get_queryset(self):
    if getattr(self, "swagger_fake_view", False):
        # queryset just for schema generation metadata
        return TableMeta.objects.none()
    return TableMeta.objects.filter(
        dataset=get_object_or_404(DataSet, id=self.request.META.get(DATASET_ID, ""))
    )

#TableFilter 是从 custom_filter.py 导入的 #custom_filter.py

class TableFilter(django_filters.FilterSet):
    class Meta:
        model = TableMeta
        fields = {
            "name": ["exact", "icontains"],
            "schema_name": ["exact"],
            "type": ["exact"],
        }

#urls.py

router.register(r"table-meta", TableMetaView, basename="table-meta")