Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:如何在通过函数后过滤模型对象?_Python_Django_Django Models_Django Queryset - Fatal编程技术网

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)