Django : 基于自定义函数过滤查询

42 投票
4 回答
43143 浏览
提问于 2025-04-16 15:51

我在我的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

你可以查看这个链接了解更多关于自定义管理器

的内容。

撰写回答