2014-01-24 81 views
2

很少有,我發現自己有一組標識符,並希望檢索與任何標識符匹配的表中的所有對象,但想要查看所有沒有任何匹配對象的標識符數據庫。如何獲得Django .filter(something__in = some_set)查詢的* UN *匹配標準?

我現在做到這一點的方法是:

some_ids = ("a", "b", "c") 
matched_objects = MyModel.objects.filter(my_key__in=some_ids) 
caught_ids = set() 
for obj in matched_objects: 
    caught_ids.add(obj.my_key) 
unmatched_ids = set(some_ids) - caught_ids 

這種感覺非常詳細。有一個更好的方法嗎?

回答

0

對於你的問題的第二部分得到DISTICT值,請my_key

caught_ids = matched_objects.values_list('my_key').distinct() 

然後得到unmatched_ids就像你以前那樣。

unmatched_ids = set(some_ids) - set(caught_ids) 

您的代碼應該是這樣的:

some_ids = ("a", "b", "c") 
matched_objects = MyModel.objects.filter(my_key__in=some_ids) 
caught_ids = matched_objects.values_list('my_key').distinct() 
unmatched_ids = set(some_ids) - set(caught_ids) 
+0

並且做出另一個查詢? – Alvaro

+0

不需要其他查詢。 –

+0

他希望兩個模型都匹配id列表和不匹配id的列表。你的代碼沒有得到第一部分,因此需要第二個查詢 – Alvaro

0
# Get a list of keys that match your IDs 

some_ids = set(some_ids) 
keys = set(MyModel.objects.filter(my_key__in = some_ids).values_list('my_key',flat=True)) 

想必keys將包含所有那些在some_ids存在的ID。現在我們可以使用典型的集合操作來標識那些匹配或不匹配的元素。這裏有一些例子(http://docs.python.org/2/library/sets.html#set-objects),但是從您的評論中,它聽起來像是你想要的:

unmatched = some_ids not in keys 
+0

我認爲這會得到與我的身份證件不匹配的現有模型。我想要的是我的編號與現有模型不匹配。 – rogueleaderr

+0

我已經更新了答案。 –

+0

我認爲現在和其他答案一樣,它會在整個表上執行SELECT DISTINCT,這看起來效率不高。如果我有10個ID,其中7個會匹配,並且數據庫中有100萬個對象,但以某種方式進行篩選似乎更好。 – rogueleaderr