如何在Django中获得两个查询集的区别?

Raj*_*kar 20 python django django-queryset

我必须查询集.alllists和订阅列表

alllists = List.objects.filter(datamode = 'A')
subscriptionlists = Membership.objects.filter(member__id=memberid, datamode='A')
Run Code Online (Sandbox Code Playgroud)

我需要一个名为unsubscriptionlist的查询集,它拥有除了订阅列表中的记录之外的alllists中的所有记录.怎么做到这一点?

Bri*_*her 15

您应该能够使用设置操作差异来帮助:

set(alllists).difference(set(subscriptionlists))
Run Code Online (Sandbox Code Playgroud)

  • 当你可以简单地使用`exclude`而不是`filter`时,解决方案太复杂了 (4认同)

mar*_*che 14

从Django 1.11开始,QuerySets difference()在其他新方法中都有一种方法.(来源:https://docs.djangoproject.com/en/1.11/releases/1.11/#models)

qs_diff = qs_all.difference(qs_part)    # Capture elements that are in qs_all but not in qs_part
Run Code Online (Sandbox Code Playgroud)

另请参阅:https://stackoverflow.com/a/45651267/5497962


Sil*_*ght 10

那么我在这里看到两个选择.

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)
Run Code Online (Sandbox Code Playgroud)

2.再做一个查询

diff = List.objects.filter(datamode = 'A').exclude(member__id=memberid, datamode='A')
Run Code Online (Sandbox Code Playgroud)