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

问题描述 投票:0回答:1

我正在使用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 它只是返回数据库中的所有记录。

我在这里遗漏了什么?如何让它基于这个新字段进行过滤?

python django filter django-rest-framework endpoint
1个回答
2
投票

你需要这样的东西 django-filter. 它将为你处理过滤,而且它很简单,写成一个 serializer.

下面是你如何可以 与DRF整合. DRF还建议使用它。在其文件中. 或者跟着一起:

安装 django-filter 用pip。

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']
© www.soinside.com 2019 - 2024. All rights reserved.