Python 如何根据返回布尔值的模型类上的方法的结果过滤查询集?
作为我的一个模型类的成员函数,我有一个返回布尔值的Python 如何根据返回布尔值的模型类上的方法的结果过滤查询集?,python,django,django-orm,Python,Django,Django Orm,作为我的一个模型类的成员函数,我有一个返回布尔值的is\u visible(self,user)方法。根据定义,它将请求用户(Djangousermodel)作为输入 我希望能够根据对该方法的响应过滤查询集。如何将此函数用作queryset筛选器 对于上下文,以下是我的is\u visible实现: def is_visible(self, user): if self.status.status_internal == "open": retur
is\u visible(self,user)
方法。根据定义,它将请求用户(Djangouser
model)作为输入
我希望能够根据对该方法的响应过滤查询集。如何将此函数用作queryset筛选器
对于上下文,以下是我的is\u visible
实现:
def is_visible(self, user):
if self.status.status_internal == "open":
return True
if self.owner == user:
return true
participations = Participation.objects.filter(event__id=self.id, participant__id=user.id)
if len(participations) > 0:
return True
if self.status.status_internal == "invite":
return True
return False
不能使用python函数筛选queryset。您必须“复制”此代码并使用筛选对象。可能重复的
qs.annotate().filter(Q(status\u status\u internal\u in=['open','invite']);Q(owner=True))
对于参与,您应该执行类似于\Q(参与设置\u参与者\u id=user.id)的操作
@imposeren感谢您将一些实际的代码示例放在一起,这样我就可以看到这些示例是如何组合起来的。。我很好奇,一个Q对象可以在一个Q对象中有2个过滤器吗?您已经注意到Q(参与设置参与者id=user.id)
,但我希望它与user.id
和事件id=self.id
匹配。我想这必须是两个不同的Q对象?Q
查询可以像qs.filter
一样使用:model.objects.filter(Q(参与设置参与者id=user.id,事件id=self.id))
等于model.objects.filter(Q(参与设置参与者id=user.id)&Q(事件id=self.id))
等于model.objects.filter(参与设置参与者id=user.id,事件id=self.id)