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)
查看自定义经理
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)
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)
| 归档时间: |
|
| 查看次数: |
24542 次 |
| 最近记录: |