【问题标题】:Lowercase Field values django models queryset小写字段值 django 模型查询集
【发布时间】:2021-10-25 10:39:26
【问题描述】:

我有一个对象模型,并且为该模型的对象分配了几个标签。标签可以是大写、小写或两种情况的混合。 我想编写一个查询集,它将返回那些具有我提供的相同标签的对象。 注意:我正在使用 django-taggit 模块。
视图.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")

模型.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)

现在我想退回所有标签为“哈利波特”、“哈利波特”或任何其他词的书籍。

PS:如果我们可以降低 'tags__name__in' 列表,我们的工作就完成了。

【问题讨论】:

标签: python django django-models django-rest-framework django-taggit


【解决方案1】:

您可以创建一个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] 将不区分大小写地匹配data 中的每个item

【讨论】:

    【解决方案2】:

    在谷歌搜索和研究文档之后,我得到了这个可以完成我工作的答案

    tag_re = '(' + 'pipe|seperated|list|of|tags' + ')'
    Book.filter(tags__name__iregex=rf'{tag_re}').distinct()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-31
      • 2015-08-31
      • 2011-05-10
      • 2012-12-15
      • 2018-10-06
      • 2013-10-10
      • 1970-01-01
      • 2016-12-18
      相关资源
      最近更新 更多