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

时间:2011-04-16 07:02:19

标签: python django django-queryset

我的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 个答案:

答案 0 :(得分:18)

我建议你为你的班级使用自定义管理员,你可以使用:

nserv = service.objects.are_active()

这可以通过以下方式实现:

class ServiceManager(models.Manager):
    def are_active(self):
        # use your method to filter results
        return you_custom_queryset

请参阅custom managers

答案 1 :(得分:17)

您可能无法使用list comprehensiongenerator expression对查询集进行后期处理。

例如:

[x for x in Q if x.somecond()]

答案 2 :(得分:16)

我刚才有类似的问题。问题是我必须返回一个QuerySet实例。对我来说,一个快速解决方案就是做一些事情:

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)

答案 3 :(得分:4)

Ignacio的答案很有趣,但它不会返回查询集。这个确实:

accepts_nested_attributes_for :payments