为什么我不能在 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',
...
),
}
或将过滤器后端添加到个人View
或ViewSet
。
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']
所以我正在使用 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',
...
),
}
或将过滤器后端添加到个人View
或ViewSet
。
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']