Django-фильтр - я хочу фильтровать в разных атрибутах только с одним входом фильтра - PullRequest
0 голосов
/ 18 декабря 2018

Имея следующую модель:

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

Я хочу использовать только один вход для просмотра по name, short_description и description.

Так, например, еслиУ меня есть следующие данные:

объект1:

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

объект2:

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

объект3:

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 голосов
/ 18 декабря 2018

Вы должны написать собственный метод для этого, отметьте 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
         )
...