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)