如何解决Django 3:过滤查询集的字母或非字母
在数据库中,我有一个表,其中包含标题可以以字母或非字母字符开头的项目。例如,数字或“ @”或“#”。该模型如下所示:
class Items(models.Model):
title = models.CharField(max_length=255)
body = models.TextField
在我看来,我想将模型分为两个对象。一个对象包含所有带有标题以字母开头的项目,另一个对象包含所有其他项目:
class ItemsView(TemplateView):
template_name = "index.html"
def get_context_data(self,**kwargs):
alpha_list = Items.objects.filter(title__startswith=<a letter>)
other_list = Items.objects.filter(title__startswith=<not a letter>)
context = {
"list_a": alpha_list,"list_b": other_list
}
return context
我一直在咨询文档,stackoverflow和神圣的Google,但到目前为止,我还没有找到解决方案。
非常感谢您的帮助。
解决方法
您可以使用regex进行过滤(使用regex101.com来测试您的正则表达式),然后使用exclude查找其他以字母开头的项目
以字母开头:
alpha_list = Items.objects.filter(title__regex=r'^[a-zA-Z].*$')
其他情况:
other_list = Items.objects.exclude(title__regex=r'^[a-zA-Z].*$')
说明:
/^[a-zA-Z].*$/
^ asserts position at start of the string
a-z a single character in the range between a (index 97) and z (index 122) (case sensitive)
A-Z a single character in the range between A (index 65) and Z (index 90) (case sensitive)
.* matches any character (except for line terminators)
* Quantifier — Matches between zero and unlimited times,as many times as possible,giving back as needed
$ asserts position at the end of the string,or before the line terminator right at the end of the string (if any)
,
您可以略微优化正则表达式以使其:
# starts with an A-Za-z
Item.objects.filter(title__regex='^[A-Za-z]')
# starts not with A-Za-z
Item.objects.exclude(title__regex='^[A-Za-z]')
但是一个更重要的问题当然是,这里的字母是什么。在这里,它将不匹配非拉丁字符,例如西里尔字母,阿拉伯语等。此外,它将不匹配具有变音符号的字符,例如äöüßÄÖÜ
等。您可以在字符块中添加其他字符或字符范围({ {1}})来处理多余的字符。
例如,您可以同时使用Latin-1 Supplement [wiki],Latin Extended-A [wiki],Latin Extended-B [wiki]和Latin Extended Addition [wiki],
[A-Za-z…]
但是我们可能还要添加阿拉伯语,西里尔字母等字符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。