如何在Django中获取两个查询集的差异?

29 投票
5 回答
31022 浏览
提问于 2025-04-16 17:20

我有两个查询集,一个叫 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)    

另外可以参考: https://stackoverflow.com/a/45651267/5497962

撰写回答