Нижний регистр Значения полей django models queryset
У меня есть модель объекта и несколько тегов, назначенных объекту этой модели. Теги могут быть прописными, строчными или сочетать оба варианта.
Я хочу написать набор запросов, который будет возвращать те объекты, которые имеют те же теги, которые я указал.
Примечание: Я использую модуль django-taggit.
.
Views.py
def home(request):
book = Book.objects.filter(tags__name__in= map(lambda s:s.lower(), ['harry-potter', 'Champak', 'Physics']))
print(book)
return HttpResponse("Books Retrieved")
Models.py
from django.db import models
from django.utils.translation import ugettext_lazy as _
from taggit.managers import TaggableManager
from taggit.models import GenericUUIDTaggedItemBase, TaggedItemBase
class UUIDTaggedItem(GenericUUIDTaggedItemBase, TaggedItemBase):
class Meta:
verbose_name = _("Tag")
verbose_name_plural = _("Tags")
class Book(models.Model):
name = models.CharField(max_length=100)
details = models.TextField(blank=True)
tags = TaggableManager(through=UUIDTaggedItem, blank = True)
Теперь я хочу вернуть все книги, в которых теги упоминаются как 'HArry-Potter', 'HARRY-POTTER', или любое другое слово.
PS: Если каким-либо образом мы сможем уменьшить список 'tags__name__in', наша работа будет закончена.
Вы можете сделать объект Q
, в котором вы фильтруете регистр вчувствительный с:
from django.db.models import Q
data = ['harry-potter', 'Champak', 'Physics']
qfilter = Q(
*[Q(tags__name__iexact=item) for item in data],
_connector=Q.OR
)
Book.objects.filter(
qfilter
)
В __iexact
[Django-doc] будет нечувствительно совпадать по регистру с каждым item
в data
.
После гугления и изучения документации я пришел к этому ответу, который делает мою работу
tag_re = '(' + 'pipe|seperated|list|of|tags' + ')'
Book.filter(tags__name__iregex=rf'{tag_re}').distinct()