Django:如何仅基于域名和带有查询参数的整个 url 进行注释?

问题描述 投票:0回答:2

我正在使用 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 匹配,而不是仅匹配域名。有人可以告诉我如何实现这一目标,或者至少为我指出正确的方向。谢谢

python django django-urls
2个回答
0
投票

这可能是不可能的,因为您无法按特定字段的部分信息进行分组。如果您确实想实现这一目标,您可能需要考虑更改您的架构。您应该将

url
parameters
分别存储为 2 个模型字段。然后你会有一个方法,或者如果你想让它看起来像一个属性,请使用
@property
装饰器,将它们组合起来并返回整个 url。将它们拆分到迁移/脚本中以适应新架构并不会太难。


0
投票

这可以使用数据库函数

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 上的 文档。

© www.soinside.com 2019 - 2024. All rights reserved.