Django : 基于自定义函数过滤查询
我在我的Django模型类里面有一个函数,现在我想用这个函数来筛选我的查询结果。
class service:
......
def is_active(self):
if datetime.now() > self.end_time:
return False
return True
现在我想把这个函数用在我的查询筛选里,像这样
nserv = service.objects.filter(is_active=True)
我知道,对于这个简单的'is_active'情况,我可以直接在筛选查询中进行比较,但对于更复杂的情况,这样做可能就不行了。那么,我该如何根据自定义函数来进行查询呢?
4 个回答
17
你可能无法直接做到这一点,不过你可以用一种叫做列表推导(list comprehension)或者生成器表达式(generator expression)的方法来处理查询结果。
举个例子:
[x for x in Q if x.somecond()]
31
我之前也遇到过类似的问题。问题在于我需要返回一个查询集实例。对我来说,一个简单的解决办法是这样做:
active_serv_ids = [service.id for service in Service.objects.all() if service.is_active()]
nserv = Service.objects.filter(id__in=active_serv_ids)
我知道这可能不是最优雅或者性能最好的方法,但对我来说是有效的。
如果想要更详细一点的做法,可以这样:
active_serv_ids = []
for service in Service.objects.all():
if service.is_active():
active_serv_ids.append(service.id)
nserv = Service.objects.filter(id__in=active_serv_ids)
21
我建议你为你的类使用一个自定义管理器,这样你就可以这样使用:
nserv = service.objects.are_active()
这可以通过类似下面的方式实现:
class ServiceManager(models.Manager):
def are_active(self):
# use your method to filter results
return you_custom_queryset
你可以查看这个链接了解更多关于自定义管理器
的内容。