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

时间:2019-05-12 07:23:40

标签: python django django-rest-framework django-filter

我是一个初学者,并且使用Django rest框架开发了一个REST API项目。 PostgreSQL数据库中有一堆带有文本字段的记录,我有一些关键字列表。我正在尝试过滤包含此文本字段中一个或某些关键字列表中的单词的数据。

您能否建议我另一种方法来组织DRF中的过滤,方法是一次使用整个关键字列表,而无需以表格形式输入它们?

我正在尝试使用django_filters

如果是过滤器类:

# filter

class DataFilter(django_filters.rest_framework.FilterSet):
    keyword = CharFilter(field_name='description', lookup_expr='icontains')

    class Meta:
        model = Data
        fields = ('keyword', )

在这里查看类:

# view

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

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

2 个答案:

答案 0 :(得分:0)

我认为您可以这样做:

首先,从BaseInFilterCharFilter创建一个新的过滤器集子类:

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 = []

然后,您可以像下面这样使用此FilterSet(与当前的实现相同):

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模板中使用此过滤器集时,您需要以逗号分隔的格式输入值,如下所示: enter image description here

答案 1 :(得分:0)

就我而言,我需要按多个关键字进行过滤,然后再从过滤后的qs中排除另一组关键字。 像 @Test public void testNotATriangle(){ assertEquals(determineType(0,1,1), "Not a Triangle"); } @Test public void testEquilateralTriangle(){ assertEquals(determineType(1,1,1), "Equilateral Triangle"); } // other test case here, for each condition public static String determineType(int a, int b, int c) { if(a >= (b+c) || c >= (b+a) || b >= (a+c) ) { return "Not a Triangle"; } else if(a==b && b==c) { return "Equilateral Triangle"; } else if (((a * a) + (b * b)) == (c * c) || ((a * a) + (c * c)) == (b * b)|| ((c * c) + (b * b)) == (a * a)) { return "Right Triangle"; } else if(a!=b && b!=c && c!=a) { return "Scalene Triangle"; } else if ((a==b && b!=c ) || (a!=b && c==a) || (c==b && c!=a)) { return "Isosceles Triangle"; } return null; } public static void main(String [] args) { determineType(1,1,9); }

base_url/?kwords=kw1,kw2,kw3&exclude=e_kw1,e_kw2&others....继承对我不起作用...这很奇怪,因为BaseInFilter是从BaseCSVFilter继承的,否则我出错了。

我的解决方案:

filters.BaseInFilter