Djangofilter+DRF ModelView为不同字段设置不同的行为

2024-09-26 22:51:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下视图集(我的当前代码)

class TeacherViewSet(viewsets.ModelViewSet):
    queryset = Teacher.objects.all()
    serializer_class = TeacherSerializer
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ['user_id', ]
    search_fields = ['=user_id']


class SchoolViewSet(viewsets.ModelViewSet):
    queryset = School.objects.filter()
    serializer_class = SchoolSerializer
    filter_backends = [filters.SearchFilter]
    filterset_fields = ['udise', ]
    search_fields = ['=udise']

模型看起来像这样

class Teacher(BaseModel):
    school = models.ForeignKey(School, on_delete=models.SET_NULL, null=True)
    user_id = models.UUIDField()


class School(models.Model):
    id = models.AutoField(primary_key=True)
    udise = models.IntegerField(unique=True)

学校的连载程序如下

class SchoolSerializer(serializers.ModelSerializer):

    class Meta:
        model = School
        fields = '__all__'
        validators = []

如果我把它改成这个(我认为应该像TeacherSet

class SchoolViewSet(viewsets.ModelViewSet):
    queryset = School.objects.filter()
    serializer_class = SchoolSerializer
    filter_backends = [DjangoFilterBackend, SearchFilter]
    filterset_fields = ['udise', ]
    search_fields = ['=udise']

我面临的问题是

  • /school/?udise=111不起作用,也不过滤任何内容
  • /teacher/?user_id=4a031bd9-4c02-4f9a-8c1b-56fb68965021工作得非常好

我想我遗漏了一些非常基本的东西。在数据库中user_idudise都是唯一的。 因此,为了缓解这种情况,我目前正在使用hack-search_fields=在DRF的默认SearchFilter后端


Tags: idfieldssearchobjectsmodelsfilterclassqueryset
1条回答
网友
1楼 · 发布于 2024-09-26 22:51:56

/school/?udise=111/teacher/?user_id=4a031bd9-4c02-4f9a-8c1b-56fb68965021中,您试图进行筛选,而不是搜索

搜索url类似于:/?search=sth。然后它在search_fields中的指定字段中搜索,并尝试查找与这些字段匹配的对象。这些字段应该是文本类型,以便能够进行搜索。请参阅有关搜索的文档:https://www.django-rest-framework.org/api-guide/filtering/#searchfilter

但是在这里,您正在尝试筛选,因此应该使用DjangoFilterBackend或自定义筛选器进行筛选:

class SchoolViewSet(viewsets.ModelViewSet):
    ...
    filter_backends = [DjangoFilterBackend]

相关问题 更多 >

    热门问题