Django Rest Framework Django Filters ModelMultipleChoiceFilter не работает с иконками
Я пытаюсь фильтровать группы разрешений Django по разрешениям внутри группы, которая имеет отношение ManyToMany. Я использую django == 3.2.5, django_filter == 2.4.0 и django_rest_framework==3.12.4.
В настоящее время фильтр работает, только если я использую "exact" в качестве поиска поля, но когда я использую "icontains", он выдает эту ошибку;
{
"permissions__icontains": [
"“can” is not a valid value."
],
Я не могу понять, что я делаю иначе, чем в документации и в этом сообщении stack overflow.
Как использовать ModelMultipleChoiceFilter?
Есть ли способ получить результаты фильтрации при неточном совпадении?
Выпьем заранее!
запрос url
http://127.0.0.1:8000/permission_groups/?permissions__icontains=can
фильтр
class PermissionsGroupFilterSet(FilterSet):
name = AllValuesMultipleFilter(field_name="name")
permissions = ModelMultipleChoiceFilter(
queryset=Permission.objects.all(), field_name="permissions__name", to_field_name="name"
)
class Meta:
model = Group
fields = {
"name": ["icontains", "in"],
"permissions": ["exact", "icontains"],
}
models.py (стандартные модели групп/разрешений)
class Group(models.Model):
name = models.CharField(_('name'), max_length=150, unique=True)
permissions = models.ManyToManyField(
Permission,
verbose_name=_('permissions'),
blank=True,
)
objects = GroupManager()
class Meta:
verbose_name = _('group')
verbose_name_plural = _('groups')
def __str__(self):
return self.name
def natural_key(self):
return (self.name,)
class Permission(models.Model):
name = models.CharField(_('name'), max_length=255)
content_type = models.ForeignKey(
ContentType,
models.CASCADE,
verbose_name=_('content type'),
)
codename = models.CharField(_('codename'), max_length=100)
objects = PermissionManager()
class Meta:
verbose_name = _('permission')
verbose_name_plural = _('permissions')
unique_together = [['content_type', 'codename']]
ordering = ['content_type__app_label', 'content_type__model', 'codename']
def __str__(self):
return '%s | %s' % (self.content_type, self.name)
def natural_key(self):
return (self.codename,) + self.content_type.natural_key()
natural_key.dependencies = ['contenttypes.contenttype']