2017-01-23 109 views
0

我有以下方法,它爲is_active=True和特定用戶返回對象。Django REST框架:使用組合過濾器從另一個查詢集中排除一個查詢集

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代替user=user2時,我只收到record_1而不是record_3。 你能幫我建立一個正確的方式來結合查詢集中的兩個過濾器嗎?

+0

除非我失去了一些東西,是不是從第一個片段,唯一的區別你需要'__is_active = FALSE'? – Sayse

+0

爲了在第一次嘗試中使用'exclude'關鍵字並在第二次嘗試中使用'〜Q',我使用了相同的過濾器。 –

+0

您可能需要進一步定義「我沒有得到正確的結果」(您得到的結果是什麼?)。在排除之間創建的查詢中可能存在細微差異,只是在篩選器中將其設置爲false – Sayse

回答

2

解決方案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) 
+0

非常感謝您的回答。第一種解決方案適用於我。第二種解決方案對我無效。 –