Django-фильтр «содержит» в соответствующем поле

#django #django-filter

#django #django-фильтр

Вопрос:

У меня есть две простые модели, которые связаны внешним ключом:

 models.py:
class Operator(models.Model):
    operator = models.CharField(max_length=50, primary_key=True, verbose_name='Operator')
    operator_name = models.CharField(max_length=100, verbose_name='Operator Name', blank=False, null=False)

class SubOperator(models.Model):
    operator = models.ForeignKey(Operator, on_delete=models.CASCADE)
    sub_operator = models.CharField(max_length=50, verbose_name='Sub Operator')
    sub_operator_name = models.CharField(max_length=100)
    start_date = models.DateField(blank=False, null=False, verbose_name='Start Date')
    end_date = models.DateField(blank=False, null=False, verbose_name='End Date')
 

Пользователь должен иметь возможность выбрать оператор с «like», который переводится как «lookup_expr=’contains'» в модуле Django-Filter, но, к сожалению, я получаю следующее исключение:
«django.core.exceptions.Ошибка поля: в соответствующем поле получен неверный поиск: содержит»

 filters.py:
operator = django_filters.CharFilter(field_name='operator', lookup_expr='contains', label='Operator')
 

Ответ №1:

Измените свой field_name аргумент на operator__operator_name вместо operator

 operator = django_filters.CharFilter(
    field_name='operator__operator_name',
    lookup_expr='contains',
    label='Operator'
) 

Ответ №2:

Только что нашел решение (документация немного вводит в заблуждение относительно того, как правильно написать выражение поиска с моей точки зрения, но, возможно, это только я ^^)

Правильный способ написать это:

 operator = django_filters.CharFilter(field_name='operator', lookup_expr='operator__contains', label='Operator')
 

Так что более или менее, если вы возьмете свой стандартный объект фильтра и проверите, какие параметры он дает вам для поля, вот что вы можете поместить в lookup_expr фильтра django!