Django REST Framework:使用组合过滤器从另一个查询集中排除一个查询集
Django REST Framework: Exclude one queryset from another with combined filters
我有以下方法 return 对象 is_active=True
和特定用户。
def filter_active_user(self, queryset, name, value):
return queryset.filter(active_states__is_active=True,
active_states__user_id=value)
我想构建一个方法,该方法将 return 一个查询集,其中包含上述方法中未包含的所有对象。所以我使用 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)
当我为 user=user2
使用 filter_active_user
时,我得到了 record_2
。
当我将 filter_inactive_user
用于 user=user2
时,我只得到 record_1
而不是 record_3
。
你能帮我建立在查询集中组合两个过滤器的正确方法吗?
解决方案一:
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))
方案二:
def filter_inactive_user(self, queryset, name, value):
qs_inactive = queryset.exclude(active_states__is_active=True).exclude(active_states__user_id=value)
我有以下方法 return 对象 is_active=True
和特定用户。
def filter_active_user(self, queryset, name, value):
return queryset.filter(active_states__is_active=True,
active_states__user_id=value)
我想构建一个方法,该方法将 return 一个查询集,其中包含上述方法中未包含的所有对象。所以我使用 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)
当我为 user=user2
使用 filter_active_user
时,我得到了 record_2
。
当我将 filter_inactive_user
用于 user=user2
时,我只得到 record_1
而不是 record_3
。
你能帮我建立在查询集中组合两个过滤器的正确方法吗?
解决方案一:
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))
方案二:
def filter_inactive_user(self, queryset, name, value):
qs_inactive = queryset.exclude(active_states__is_active=True).exclude(active_states__user_id=value)