Как отфильтровать набор запросов django, используя нечувствительный к регистру __in?

У меня есть модель:

class Skill(models.Model):
    name = models.CharField(max_length=120)
    icon = models.CharField(max_length=20)
    color = models.CharField(max_length=7)

Я хочу сделать следующий фильтр, но без учета регистра:

skill_names = ['Code Quality', 'Analytical Thinking', 'Productivity', 'Communication']
Skill.objects.filter(name__in=skill_names)

Надеюсь, это поможет вам.

from django.db.models import Q

skill_names = ['Code Quality', 'Analytical Thinking', 'Productivity', 'Communication']

query = Q()

for skill in skill_names:
    query |= Q(name__contains=skill)

Skill.objects.filter(query)

Я бы, вероятно, сделал что-то вроде этого (не проверено):

Skill.objects.filter(name__in=[sn.lower() for sn in skill_names])

У меня была похожая проблема, и это помогло мне

from operator import or_
from functools import reduce
from django.db.models import Q

skill_names = ['Code Quality', 'Analytical Thinking', 'Productivity', 'Communication']
skill_filter = reduce(
    or_, (Q(name__icontains=skill) for skill in skill_names)
)
Skill.objects.filter(name__in=skill_filter)
Вернуться на верх