Django过滤器-我想仅用一个过滤器输入来过滤不同的属性

时间:2018-12-18 08:19:56

标签: python django django-queryset django-filter

具有以下模型:

class Project(models.Model):
    ...
    name = models.CharField(max_lenght=70)
    short_description = models.CharField(max_length=135)
    description = models.CharField(max_lenght=25000)
    ...

我只想使用一个输入来按nameshort_descriptiondescription进行查找。

例如,如果我有以下数据:

object1:

name = "Amazing airplanes"
short_description = "This project wants to be ..."
description = "... ... ..."

object2:

name = "Testing potatoes as batteries"
short_description = "... ... ... "
description = "... this project ..."

object3:

name = "project creator"
short_description = "... ... ..."
description = "... ... ..."

我只用project过滤过滤器的一个输入,因此必须得到三个对象。 (另外,如果一个对象在少数几个属性中具有相同的单词,则该对象只能返回一次)

我现在所拥有的是这个

class ProjectListFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(lookup_expr='icontains')
    short_description = django_filters.CharFilter(lookup_expr='icontains')
    description = django_filters.CharFilter(lookup_expr='icontains')

    class Meta:
        model = Project
        fields = ['name', 'short_description', 'description']
        queryset = Project.objects.all()

但这会生成3个输入,这是我要规避的。

1 个答案:

答案 0 :(得分:0)

您应该为此编写一个自定义方法,选中docs,您的代码应如下所示:

class ProjectListFilter(django_filters.FilterSet):
    name = django_filters.CharFilter(method='my_filter')

    class Meta:
        model = Project
        fields = ['name', ]

    def my_filter(self, queryset, name, value):
         return queryset.filter(
             name__icontains=value
         ) | queryset.filter(
             short_description__icontains=value
         ) | queryset.filter(
             description__icontains=value
         )