Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何通过多个关键字从数据库中过滤DRF中的数据?_Python_Django_Django Rest Framework_Django Filter - Fatal编程技术网

Python 如何通过多个关键字从数据库中过滤DRF中的数据?

Python 如何通过多个关键字从数据库中过滤DRF中的数据?,python,django,django-rest-framework,django-filter,Python,Django,Django Rest Framework,Django Filter,我是一个初学者,用Django REST框架开发了一个REST API小项目。PostgreSQL数据库中有很多记录,其中有一个文本字段,我有一些关键字列表。我正在尝试筛选包含此文本字段中一个或一些关键字列表中的单词的数据 你能建议我另一种方法来组织DRF中的过滤,一次使用整个关键字列表,而不在表单中输入它们吗 我正试着用django_过滤器 如果过滤器类别为: #过滤器 类DataFilter(django_filters.rest_framework.FilterSet): 关键字=Char

我是一个初学者,用Django REST框架开发了一个REST API小项目。PostgreSQL数据库中有很多记录,其中有一个文本字段,我有一些关键字列表。我正在尝试筛选包含此文本字段中一个或一些关键字列表中的单词的数据

你能建议我另一种方法来组织DRF中的过滤,一次使用整个关键字列表,而不在表单中输入它们吗

我正试着用django_过滤器

如果过滤器类别为:

#过滤器
类DataFilter(django_filters.rest_framework.FilterSet):
关键字=CharFilter(字段\u name='description',查找\u expr='icontains')
类元:
模型=数据
字段=(‘关键字’,)
此处,如果查看类:

#查看
类数据列表(generics.ListAPIView):
def get_queryset(自我):
返回Data.objects.filter(deadline_ugte=date.today())
序列化程序\u类=数据序列化程序
filter\u backends=(filters.DjangoFilterBackend,)
filterset_class=数据过滤器

但是在这种情况下,它只过滤我在表单中输入的一个单词。

我想你可以这样做:

class DataFilter(django_filters.FilterSet):
    keyword__in = CharInFilter(field_name='keyword', lookup_expr='in')

    class Meta:
        model = Data
        fields = []
class DataList(generics.ListAPIView): 

    def get_queryset(self):
        return Data.objects.filter(deadline__gte=date.today())

    serializer_class = DataSerializer   
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = DataFilter
首先,从和
CharFilter
创建一个新的过滤器集子类:

class CharInFilter(django_filters.BaseInFilter, django_filters.CharFilter):
    pass
然后,更新FilterSet类,如下所示:

class DataFilter(django_filters.FilterSet):
    keyword__in = CharInFilter(field_name='keyword', lookup_expr='in')

    class Meta:
        model = Data
        fields = []
class DataList(generics.ListAPIView): 

    def get_queryset(self):
        return Data.objects.filter(deadline__gte=date.today())

    serializer_class = DataSerializer   
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = DataFilter
然后您可以像这样使用此过滤器集(与当前实现相同):

class DataFilter(django_filters.FilterSet):
    keyword__in = CharInFilter(field_name='keyword', lookup_expr='in')

    class Meta:
        model = Data
        fields = []
class DataList(generics.ListAPIView): 

    def get_queryset(self):
        return Data.objects.filter(deadline__gte=date.today())

    serializer_class = DataSerializer   
    filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = DataFilter
在DRF模板中使用此过滤器集时,需要以逗号分隔格式输入值,如下所示:

在我的例子中,我需要按多个关键字过滤,然后从过滤的qs中排除另一组关键字。 类似于
base\u url/?kwords=kw1、kw2、kw3和exclude=e\u kw1、e\u kw2和其他….

过滤器继承。BaseInFilter
对我不起作用。。。这很奇怪,因为BaseInFilter继承自BaseCSVFilter,或者我犯了一个错误

我的解决方案:

从django.db.models导入Q
从django_过滤器导入rest_框架作为过滤器
从产品。模型导入产品
类KwordIncludeFilter(filters.BaseCSVFilter):
def过滤器(自身、qs、值):
query=Q()
如果不是值:
返回qs
其他:
对于值中的值:
value=value.strip()
查询|=Q(名称u icontains=value)
qs=qs.filter(查询)
返回qs
类KwordExcludeFilter(filters.BaseCSVFilter):
def过滤器(自身、qs、值):
query=Q()
如果不是值:
返回qs
其他:
对于值中的值:
value=value.strip()
查询|=Q(名称u icontains=value)
qs=qs.exclude(查询)
返回qs
类ProductFilter(filters.FilterSet):
kwords=KwordIncludeFilter()
exclude=KwordExcludeFilter()
类元:
型号=产品
字段={
“some_other_model_Field':[“some_lookup”]
}

你好,伊万!谢谢。但不幸的是,它不起作用-空的结果(嗨,@caravan4eg你尝试过下面给出的答案吗:)?你有没有遇到什么问题?嗨,@ruddra!是的,我做了)但我还是有麻烦。Ivan的建议必须有效,但在我的情况下,它不会过滤,不会返回任何结果(