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

Neo*_*Neo 32 python django django-queryset

我有一个内置在我的Django模型类中的函数,我想使用该函数来过滤我的查询结果.

  class service:
       ......
       def is_active(self):
            if datetime.now() > self.end_time:
                  return False
            return True
Run Code Online (Sandbox Code Playgroud)

现在我想将此函数用于我的查询过滤器,例如

nserv = service.objects.filter(is_active=True)
Run Code Online (Sandbox Code Playgroud)

我知道,对于这个简单的'is_active'情况,我可以直接在过滤查询中进行这种比较,但对于更复杂的情况,这可能是不可能的.我应该如何基于自定义函数进行查询?

Lap*_*anc 18

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

nserv = service.objects.are_active()

这将通过以下方式实现:

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

查看自定义经理

  • `#使用你的方法来过滤结果`几乎是问题是如何做的问题. (23认同)

Wal*_*ner 17

我刚才有类似的问题.问题是我必须返回一个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)
Run Code Online (Sandbox Code Playgroud)

非常确定这不是最漂亮和高效的方式,但我能为我工作.

一个更冗长的方式是:

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)
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 16

您可能无法使用列表推导或生成器表达式对查询集进行后处理.

例如:

[x for x in Q if x.somecond()]
Run Code Online (Sandbox Code Playgroud)

  • LC = [列表理解](http://docs.python.org/tutorial/datastructures.html#list-comprehensions)。genex = [生成器表达式](http://docs.python.org/reference/expressions.html#generator-expressions) (6认同)
  • 这不会返回Queryset,因此不能在某些上下文中使用(例如,填充表单中的选择框) (5认同)
  • 什么是LC/genex? (3认同)
  • @Neo没关系,我从来没有听过人们之前将它们称为LC或genex. (2认同)

dan*_*ast 9

Ignacio 的回答很有趣,但它没有返回查询集。这个是:

def users_by_role(role):
    users = User.objects.all()
    ids = [user.id for user in users if user.role == role]
    return users.filter(id__in=ids)
Run Code Online (Sandbox Code Playgroud)