如何在Django中获取两个查询集的差异?
我有两个查询集,一个叫 alllists,另一个叫 subscriptionlists。
alllists = List.objects.filter(datamode = 'A')
subscriptionlists = Membership.objects.filter(member__id=memberid, datamode='A')
我需要一个新的查询集,叫 unsubscriptionlist,它包含 alllists 中的所有记录,但不包括 subscriptionlists 中的记录。我该怎么做呢?
5 个回答
11
我看到这里有两个选择。
1. 手动过滤(看起来不太好)
diff = []
for all in alllists:
found = False
for sub in subscriptionlists:
if sub.id == all.id:
found = True
break
if not found:
diff.append(all)
2. 直接再发一个查询
diff = List.objects.filter(datamode = 'A').exclude(member__id=memberid, datamode='A')
22
你可以使用集合操作中的差集来帮助解决这个问题:
set(alllists).difference(set(subscriptionlists))
37
从Django 1.11开始,QuerySets(查询集)新增了一个叫做 difference()
的方法,还有其他一些新方法:
# Capture elements that are in qs_all but not in qs_part
qs_diff = qs_all.difference(qs_part)