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.

https://django-filter.readthedocs.io/en/stable/ref/filters.html?highlight=ModelMultipleChoiceFilter#modelmultiplechoicefilter

Как использовать 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']
Вернуться на верх