我正在使用 django,我正在尝试提出一个查询,该查询将允许我执行以下操作,
我的数据库中有一个名为
url
的列。 url
列的值非常长。基本上是域名后面跟着一长串查询参数。
例如:
https://www.somesite.com/something-interesting-digital-cos-or-make-bleh/?utm_source=something&utm_medium=email&utm_campaign=biswanyam%20report%20-%20digital%20cos%20or%20analog%20prey&ut
http://www.anothersite.com/holly-moly/?utm_source=something&utm_medium=email&tm_campaign=biswanyam%20report%20-%20digital%20cos%20or%20analog%20prey&ut
https://www.onemoresite.com/trinkle-star/?utm_source=something&utm_medium=email&utm_campaign=biswanyam%20report%20-%20digital%20cos%20or%20analog%20prey&ut
https://www.somesite.com/nothing-interesting-bleh/?utm_source=something&utm_medium=email&utm_campaign=biswanyam%20report%20-%20digital%20cos%20or%20analog%20prey&ut
我想要一个 django 查询,它基本上可以为我提供具有相同域名的带注释的 url 计数,而不管 URL 中的查询参数如何。
所以本质上这就是我正在寻找的,
{
'url': 'https://www.somesite.com/something-interesting-digital-cos-or-make-bleh', 'count': 127,
'url': 'http://www.anothersite.com/holly-moly', 'count': 87,
'url': 'https://www.onemoresite.com/trinkle-star', 'count': 94,
'url': 'https://www.somesite.com/nothing-interesting-bleh', 'count':72
}
我尝试过这个查询,
Somemodel.objects.filter(url__iregex='http.*\/\?').values('url').annotate(hcount=Count('url'))
这并没有按预期工作。它与查询参数一起进行整个 URL 匹配,而不是仅匹配域名。有人可以告诉我如何实现这一目标,或者至少为我指出正确的方向。谢谢
这可能是不可能的,因为您无法按特定字段的部分信息进行分组。如果您确实想实现这一目标,您可能需要考虑更改您的架构。您应该将
url
和 parameters
分别存储为 2 个模型字段。然后你会有一个方法,或者如果你想让它看起来像一个属性,请使用 @property
装饰器,将它们组合起来并返回整个 url。将它们拆分到迁移/脚本中以适应新架构并不会太难。
这可以使用数据库函数
StrIndex
和 Substr
的组合来创建子字符串注释
这是一个示例,说明如何基于获取“@”符号后的文本来使用“域字段”注释
User
查询:
from django.db.models.functions import StrIndex, Substr
from django.db.models import Value
User.objects.annotate(domain=Substr("email", 1 + StrIndex("email", Value("@"))))
对于 url,您需要在“?”之前对文本进行切片...有关详细信息,请查看 Substr 上的 文档。