Django:如何在传递函数后过滤模型对象?
Django: How to filter model objects after passing through functions?
我有一个名为 Service
的模型,它有一个类型为 str
的字段 url
。我有一个函数 f
returns 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)]
但那样的话,我会得到 list
,而不是 QuerySet
。
有没有办法过滤对象并得到满足上述条件的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))
编辑
如何使用_istartwith
:
queryset = Service.objects.filter(Q(url__istartswith=target_not_safe) | Q(url__istartswith=target_safe))
编辑 2
另一个技巧是使用 __in
检查列表内部。所以:
query_list = [<b>x.id</b> for x in Service.objects.all() if(f(x.url) == target)]
<b>queryset = Service.objects.filter(id__in=query_list)</b>
我有一个名为 Service
的模型,它有一个类型为 str
的字段 url
。我有一个函数 f
returns 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)]
但那样的话,我会得到 list
,而不是 QuerySet
。
有没有办法过滤对象并得到满足上述条件的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))
编辑
如何使用_istartwith
:
queryset = Service.objects.filter(Q(url__istartswith=target_not_safe) | Q(url__istartswith=target_safe))
编辑 2
另一个技巧是使用 __in
检查列表内部。所以:
query_list = [<b>x.id</b> for x in Service.objects.all() if(f(x.url) == target)]
<b>queryset = Service.objects.filter(id__in=query_list)</b>