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

2024-04-19 03:13:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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”情况,我可以直接在filter查询中进行比较,但对于更复杂的情况,这可能是不可能的。如何根据自定义函数进行查询?


Tags: django函数模型selftruereturnifis
3条回答

我建议您为您的班级使用自定义管理器,这样您就可以使用:

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

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

例如:

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

我也有类似的问题。问题是我必须返回一个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)

相关问题 更多 >