Проблемы между django и django-filter
Моя проблема заключается в том, что библиотека django-filter не работает корректно с полями выбора в django rest framework: model:
class Incident(models.Model):
caller = models.ForeignKey(
'core.Caller',
verbose_name='caller',
on_delete=models.PROTECT,
related_name='incidents',
blank=True,
null=True,
)
declarant = models.ForeignKey(
'core.Declarant',
verbose_name='declarant',
on_delete=models.CASCADE,
related_name='incidents',
blank=True,
null=True,
)
kind = models.ForeignKey(
IncidentKind,
verbose_name='kind',
on_delete=models.SET_NULL,
related_name='incidents',
blank=True,
null=True,
)
duplicate_of = models.ForeignKey(
'self',
verbose_name='duplicate',
on_delete=models.CASCADE,
related_name='duplicates',
blank=True,
null=True,
)
source = models.CharField(
'source',
max_length=255,
default=consts.IncidentSource.APP,
choices=consts.IncidentSource.CHOICES,
)
status = models.CharField(
'status',
max_length=255,
choices=consts.IncidentStatus.CHOICES,
default=consts.IncidentStatus.REQUEST_112,
)
фильтр:
class Incident(django_filters.FilterSet):
description = django_filters.CharFilter(lookup_expr='icontains')
declarant_phone = django_filters.CharFilter(field_name='declarant__phone', lookup_expr='icontains')
incident_address = django_filters.CharFilter(field_name='address__full_address', lookup_expr='icontains')
source = django_filters.ChoiceFilter(choices=consts.IncidentSource.CHOICES, lookup_expr='icontains')
status = django_filters.ChoiceFilter(choices=consts.IncidentStatus.CHOICES, lookup_expr='icontains')
service = django_filters.Filter(method='filter_service')
address_caller = django_filters.CharFilter(field_name='caller__address', lookup_expr='icontains')
victims = django_filters.BooleanFilter(method='filter_victims')
death = django_filters.BooleanFilter(method='filter_death')
dt_create = django_filters.Filter(method='filter_dt_create')
incident_moment = django_filters.Filter(method='filter_incident_moment')
class Meta:
model = models.Incident
fields = [
'is_needs_reaction',
'is_social_significant',
'is_risk_emergency',
'description',
'declarant_phone',
'status',
'source',
'operator',
'incident_address',
'kind',
'service',
'address_caller',
'victims',
'death',
'dt_create',
]
Поле выбора источника и статуса.
Ошибка:
super()._set_choices(value)
AttributeError: 'super' object has no attribute '_set_choices'
Если я использую CharFilter, то фильтрация работает, но не совсем так, как нужно
source = django_filters.CharFilter(choices=consts.IncidentSource.CHOICES, lookup_expr='icontains')
status = django_filters.CharFilter(choices=consts.IncidentStatus.CHOICES, lookup_expr='icontains')
Моя трассировка:
Я также просто попробовал передать поля source и status в поле fields, это тоже не помогло. Задавал вопросы GPT, он говорит, что одной из возможных проблем может быть ошибка в самой библиотеке, поэтому решил задать еще один вопрос здесь, вдруг у кого-то была похожая ситуация
Уберите lookup_expr
при использовании поля выбора. По умолчанию используется точное выражение поиска, поскольку это поле выбора.
Пример работающего фильтра из моего Django-приложения выглядит так:
DOMAIN_CHOICES = (
('Educations', 'Educations'),
('Certificates', 'Certificates'),
('Qualifications', 'Qualifications'),
)
class HistoryFilter(filters.FilterSet):
domain = filters.ChoiceFilter(choices=DOMAIN_CHOICES, required=True)
class Meta:
model = EmployeeHistory
fields = ['domain']