我正在使用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
它只是返回数据库中的所有记录。
我在这里遗漏了什么?如何让它基于这个新字段进行过滤?
你需要这样的东西 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',
...
),
}
或者将过滤器后端添加到一个单独的 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']