Python 动态对象过滤器

Python 动态对象过滤器,python,django,Python,Django,我有一个过滤器查询,它根据搜索条件而变化 有时是: Thing.object.filter(name__startswith=word).distinct('id') 有时: Thing.object.filter(city__startswith=word) 因此,.filter(之后的所有内容都可以更改。有没有办法动态设置它?对.filter()的参数进行设置,是的。只需创建一个字典 D = {'city__startswith': word} things = Thing.object

我有一个过滤器查询,它根据搜索条件而变化

有时是:

Thing.object.filter(name__startswith=word).distinct('id')
有时:

Thing.object.filter(city__startswith=word)

因此,
.filter(
之后的所有内容都可以更改。有没有办法动态设置它?

.filter()
的参数进行设置,是的。只需创建一个字典

D = {'city__startswith': word}
things = Thing.object.filter(**D)

调用
.distinct()
,否。您需要使用特殊情况。

调用
.filter()
的参数,是的。只需创建一个字典

D = {'city__startswith': word}
things = Thing.object.filter(**D)

调用
.distinct()
,否。您需要使用特殊情况。

如果“city”和“name”是条件选择器的值,您可以执行以下操作:

queryset = Thing.object.filter(**{'%s__startswith' % criteria: word})

if criteria_requires_distinct:
    queryset = queryset.distinct()

如果“城市”和“名称”是条件选择器的值,则可以执行以下操作:

queryset = Thing.object.filter(**{'%s__startswith' % criteria: word})

if criteria_requires_distinct:
    queryset = queryset.distinct()

我可以这样做吗与Q对象分开?嗯,不是。你是通过方法调用来完成的。我有一个dic的查找,正如你所说的
D
。但是其中一些需要
distinct
,我可以进行键查找并设置distinct部分,然后对db进行查询吗?在你请求结果之前,不会执行任何查询。在我请求结果之前,你是什么意思?我尝试了什么现在不能做的是:
如果name\uuu startswith在D:Thing.object.filter(name\uuu startswith=word.distinct('id')
,这将只查询name。但是我想查询所有的标准,我可以这样做
distinct()
与Q对象分开?嗯,不是。你是通过方法调用来完成的。我有一个dic的查找,正如你所说的
D
。但是其中一些需要
distinct
,我可以进行键查找并设置distinct部分,然后对db进行查询吗?在你请求结果之前,不会执行任何查询。在我请求结果之前,你是什么意思?我尝试了什么现在不能做的是:
如果name\uuu startswith在D:Thing.object.filter(name\uu startswith=word.distinct('id')
,这将只查询name。但是我想查询所有的标准这是一个很好的方法,我喜欢它。所以在
distinct()
我将触摸db两次,对吗?不,只要一次您获取代码中的
获取结果
:(.当我
返回render\u to\u response(“index.html”,queryset,context\u instance=RequestContext(request))
?结果将是您迭代查询集后的结果。例如,它将触摸db一次对于queryset中的东西:“不在视图或模板中显示这是一个很好的方法,我喜欢它。因此在
distinct()
之后,我将触摸db两次,对吗?不,只需一次,在代码中,什么是
fetch result
:(。当我
返回render\u to\u响应(“index.html”,queryset,context\u instance=RequestContext)(request))
?结果将在您迭代查询集后显示。它将在执行例如“for thing in queryset:”后触摸数据库,但不会在视图或模板中显示