2016-06-17 44 views
0

這是我的理解(從我在我的代碼觀察到的),如果我這樣做:Django的Q過濾器返回很多沒有結果的許多領域

Distinct_Alert.objects.filter(somefield=somevalue) 

我應該得到的是該查詢完全匹配的行,與說

Distinct_Alert.objects.filter(somefield=somevalue, entities__in=somelist) 

說,我的列表包括3個要素,我有可以匹配的要素之一,那麼它將返回該行的行。我想要做的只是如果它匹配列表中的所有元素,這是可能的嗎?

我試着做以下幾點:

Distinct_Alert.objects.filter(Q(alert_type=alert_type) & reduce(operator.and_, [Q(entities=c) for c in entities])) 

實體是一個多對多的領域,由於種種原因,這始終是一個沒有返回比賽,即使我可以很符合這個確切條件的行。 Q不適用於許多領域?

按照建議,我已經試過鏈接和它的工作原理,但這種做法感覺錯了,靠不住

chained_query = Distinct_Alert.objects.filter(alert_type=alert_type) 
for entity in entities: 
    chained_query = chained_query.filter(entities=entity[0]) 

這將返回正確的結果,但這並不:

Distinct_Alert.objects.filter(Q(alert_type=alert_type) & reduce(operator.and_, [Q(entities=c[0]) for c in entities])) 

而且,鏈式過濾器是否會遇到潛在的問題,其中搜索的子集小於包含集合的行?

+3

的[Django的篩選查詢集\ _ \ _在\ *每\ *在列表項(HTTP可能重複://計算器.com/questions/8618068/django-filter-queryset-in-for-every-item-in-list) –

+0

嘿@ShangWang我編輯了這個問題來更準確地描述我的情況,我不相信它是重複的。 –

回答

0

嘗試使用問:

from django.contrib.db.models import Q 

然後

Distinct_Alert.objects.filter(somefield=somevalue).exclude(~Q(number__in=somelist)) 
+0

我用Q更新了我的問題,但仍遇到問題:( –

+0

當您知道實體是m2m時,您將它們全部設爲alert = Distinct_Alert.objects.get(id = alert_id),然後實體= alert.entities。所有() - 這將返回所有的實體,所以你可以排除列表中的那些 – dmitryro

+0

我不想從列表中排除它們,我試圖找到匹配的Distinct_Alert行,我需要警報類型匹配和相關實體匹配 –