为什么我不能在 Django Rest Framework 中过滤一个新字段?

Why can't I filter on one new field in Django Rest Framework?

所以我正在使用 Django Rest Framework 编辑现有代码库,并向模型添加了一个新字段:

class MyModel(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=150, null=True)
    the_new_field = models.IntegerField(null=True, default=None)

我有一个序列化器,它是相当基础的:

class MyModelSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyModel
        fields = (
            'id',
            'name',
        )

所以我只是向序列化程序添加了新字段:

class MyModelSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = MyModel
        fields = (
            'id',
            'name',
            'the_new_field',
        )

我可以使用 name 使用 ?name=awesomename 调用端点,它实际上基于 awesomename 进行过滤,但是当我使用 ?the_new_field=123456 调用端点时,它只是 returns数据库中的所有记录。

我在这里错过了什么?我怎样才能让它根据这个新字段进行过滤?

你需要像 django-filter 这样的东西。它将为您处理过滤,写成 serializer.

很简单

这里是您可以 integrate with DRF. DRF also recommends using it in their docs 的方法。或跟随:

使用 pip 安装 django-filter

pip install django-filter

然后将 django_filters 添加到您的 INSTALLED_APPS

INSTALLED_APPS = [
    ...
    'rest_framework',
    'django_filters',
]

如果您想默认使用 django-filter 后端,请将其添加到 DEFAULT_FILTER_BACKENDS 设置中。

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
        ...
    ),
}

或将过滤器后端添加到个人ViewViewSet

from django_filters.rest_framework import DjangoFilterBackend

class YourView(generics.ListAPIView):
    ...
    filter_backends = [DjangoFilterBackend]

然后将过滤器添加到您当前的视图中,如下所示:

class MyModelList(generics.ListAPIView):
    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'the_new_field']