我有以下is_active=True
为特定用户返回对象的方法。
def filter_active_user(self, queryset, name, value):
return queryset.filter(active_states__is_active=True,
active_states__user_id=value)
我想建立一个方法,该方法将返回一个查询集,其中包含上述方法中未包含的所有对象。因此,我使用以下方法创建了以下方法exclude
:
def filter_inactive_user(self, queryset, name, value):
return queryset.exclude(active_states__is_active=True,
active_states__user_id=value)
我还尝试了使用以下实现~Q
:
def filter_inactive_user(self, queryset, name, value):
return queryset.filter(~Q(active_states__is_active=True,
active_states__user_id=value))
但是,我没有得到正确的结果。例如,在一个测试案例中,我创建了一些数据,该数据由3个对象组成。使用该方法,filter_active_user
我得到了1个对象,希望使用该filter_inactive_user
方法得到另外2个对象,但是我也得到了1个对象。下面更具体地介绍一下我的测试数据:
record_1.set_active_states_for_users([self.user1.uuid], True)
record_2.set_active_states_for_users([self.user1.uuid], False)
record_2.set_active_states_for_users([self.user2.uuid], True)
record_3.set_active_states_for_users([self.user2.uuid], False)
当我使用的filter_active_user
为user=user2
我得到了record_2
。当我使用filter_inactive_user
for时,user=user2
我只会得到record_1
而不是record_3
。您能帮我建立在查询集中组合两个过滤器的正确方法吗?
解决方案1:
def filter_inactive_user(self, queryset, name, value):
qs_active = queryset.filter(active_states__is_active=True, active_states__user_id=value)
qs_inactive = queryset.exclude(pk__in=qs_active.values_list('pk', flat=True))
解决方案2:
def filter_inactive_user(self, queryset, name, value):
qs_inactive = queryset.exclude(active_states__is_active=True).exclude(active_states__user_id=value)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句