2014-01-24 43 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