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))

Q objects

编辑

如何使用_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>