Python Django:如何在通过函数后过滤模型对象?
我有一个名为Python Django:如何在通过函数后过滤模型对象?,python,django,django-models,django-queryset,Python,Django,Django Models,Django Queryset,我有一个名为Service的模型,它有一个类型为str的字段url。我有一个函数f,它返回url的主机名: def f(url): return urllib.parse.urlparse(url).hostname 我想获取其f(url)等于值target的所有对象 实现这一目标的一种方法是执行以下操作: [x for x in Service.objects.all() if(f(x.url) == target)] 但是在这种情况下,我将得到一个列表,而不是查询集 有没有一种方
Service
的模型,它有一个类型为str
的字段url
。我有一个函数f
,它返回url的主机名:
def f(url):
return urllib.parse.urlparse(url).hostname
我想获取其f(url)
等于值target
的所有对象
实现这一目标的一种方法是执行以下操作:
[x for x in Service.objects.all() if(f(x.url) == target)]
但是在这种情况下,我将得到一个列表,而不是查询集
有没有一种方法可以过滤对象并获得满足上述条件的QuerySet
?您可以这样尝试sthg而不是循环,我们正在更改目标:
from django.db.models import Q
target_not_safe = 'http://'+target
target_safe = 'https://'+target
queryset = Service.objects.filter(Q(url=target_not_safe) | Q(url=target_safe))
编辑
如何使用:
编辑2
另一个技巧可能是使用检查列表内部。因此:
query\u list=[x.id for x in Service.objects.all()如果(f(x.url)==target)]
queryset=Service.objects.filter(id\u in=query\u list)
仅当url
包含http://something.com
或https://something.com
,对吗?如果url包含http://something.com/a/b/c/d
,对吗?但我的要求是,它也应该考虑到这些对象。@SanjibanBairagya使用startswith
怎么样?我认为这应该适用于大多数情况,但听起来不是一个健壮的解决方案,对吗?多个URL可能以相同的主机名开头。基本上,没有办法将这个简单的查询转换为Django:从f(someVar)=someOtherVar
的某个地方选择某个东西,其中f
是一个自定义函数?是的。。。显然这是一种诡计。。。。“多个URL可能以相同的主机名开头”是什么意思。如果您有相同的主机,那么您的方法也将提供与它相同的输出,而不是???我的意思是,假设有两个网站:第一个网站有主机名a.b.c
,另一个网站有主机名a.b.c.d
或a.b.cd
。在这种情况下,startsWith
将变成True
,这将不满足要求。
解决方案中的\u看起来不错,我就用那个。谢谢
queryset = Service.objects.filter(Q(url__istartswith=target_not_safe) | Q(url__istartswith=target_safe))
query_list = [x.id for x in Service.objects.all() if(f(x.url) == target)]
queryset = Service.objects.filter(id__in=query_list)