我的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'情况,我可以直接在过滤查询中进行这种比较,但对于更复杂的情况,这可能是不可能的。我应该如何基于自定义函数进行查询?
答案 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
答案 1 :(得分:17)
答案 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