【问题标题】:Filter Model Object using Wild-Chars使用通配符过滤模型对象
【发布时间】:2021-08-04 08:19:33
【问题描述】:
我需要能够使用通配符进行过滤,例如:
Surnames.objects.filter(surname="GR%FF%N")
应返回具有以下姓氏的对象:GRIFFIN、GREFFTEN、GRAFFAIN 等。现在显然filter 不承认% 是一个通配符,但上面的代码应该演示我需要做什么。我还希望限制返回的结果数量。你会如何建议我这样做?
【问题讨论】:
标签:
python
django
django-models
django-orm
【解决方案1】:
您可以通过使用__regex lookup [Django-doc] 来处理正则表达式:
Surnames.objects.filter(<b>surname__regex='^GR.*FF.*N$'</b>)
您可以通过切片查询集来限制结果的数量:
Surnames.objects.filter(surname__regex='^GR.*FF.*N$')[:20]
因此,我们在这里返回前 20 个结果。由于我们没有使用.order_by(),它可以按任何顺序返回项目。
【解决方案2】:
有很多方法可以在支持您的数据库的 Django 上进行过滤。
对于通配符查询,您可以这样做:
Surnames.objects.filter(surname__icontain="YOUR QUERY TERM")
Surnames.objects.filter(surname__contain="YOUR QUERY TERM")
上面一个区分大小写,另一个不区分大小写
还有一些其他查询可以帮助您完成工作:
startswithendswithistartswithiendswith
另外,您可以使用regex 查找通过正则表达式模式进行查询。
下面我向您展示了如何完成工作:
Surnames.objects.filter(surname__regex="YOUR REGEX PATTERN")
Surnames.objects.filter(surname__startswith="YOUR QUERY TERM")
Surnames.objects.filter(surname__iendswith="YOUR QUERY TERM")
Surnames.objects.filter(surname__istartswith="YOUR QUERY TERM")