Python 如何获得Django中两个查询集的差异?

Python 如何获得Django中两个查询集的差异?,python,django,django-queryset,Python,Django,Django Queryset,我得去问一问。所有列表和订阅列表 alllists = List.objects.filter(datamode = 'A') subscriptionlists = Membership.objects.filter(member__id=memberid, datamode='A') 我需要一个名为unsubscriptionlist的查询集,它拥有AllList中的所有记录,订阅列表中的记录除外。如何实现这一点?我在这里看到两种选择 1.手动过滤(非常难看) 2.再问一个问题 您应该能够

我得去问一问。所有列表和订阅列表

alllists = List.objects.filter(datamode = 'A')
subscriptionlists = Membership.objects.filter(member__id=memberid, datamode='A')

我需要一个名为unsubscriptionlist的查询集,它拥有AllList中的所有记录,订阅列表中的记录除外。如何实现这一点?

我在这里看到两种选择

1.手动过滤(非常难看) 2.再问一个问题
您应该能够使用设置操作差异来帮助:

set(alllists).difference(set(subscriptionlists))
那么:

subscriptionlists = Membership.objects.filter(member__id=memberid, datamode='A')
unsubscriptionlists = Membership.objects.exclude(member__id=memberid, datamode='A')
取消订阅列表应与订阅列表相反


Brian的答案也会起作用,不过set()很可能会对查询进行求值,并且在将两个集求值到内存中时会对性能造成影响。此方法将保留延迟初始化,直到您需要数据。

自Django 1.11以来,QuerySet在其他新方法中有一个方法:

# Capture elements that are in qs_all but not in qs_part
qs_diff = qs_all.difference(qs_part)    

另请参见:

示例中的两个查询集似乎使用了不同的模型。对于你的问题,他们需要使用相同的模型才能理解。这是一个相关的答案,它要简洁得多-当你可以简单地使用
排除
而不是
过滤
时,解决方案太复杂了。是的,如果用一个查询集就可以获得所需的结果,这肯定不是最佳的,但如果出于某种原因它不能,这是一个可行的解决方案。我没有考虑过。为那些正在进行复杂查询集数学运算的人留下很好的信息。还有另一种做同样事情的方法:set(alllist)-set(sssubscriptionlist)
unsubscriptionlist=Membership.objects.exclude(member\uu id=memberid,datamode='A')
应该是:
unsubscriptionlist=Membership.objects.filter(datamode='A').exclude)(member\uu id=memberid)
我如何在Django 1.10上实现它?
subscriptionlists = Membership.objects.filter(member__id=memberid, datamode='A')
unsubscriptionlists = Membership.objects.exclude(member__id=memberid, datamode='A')
# Capture elements that are in qs_all but not in qs_part
qs_diff = qs_all.difference(qs_part)