在Django如何得到两个querysets的差异?

2024-09-30 14:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

我需要一个名为unsubscriptionlist的queryset,它拥有除订阅列表中的记录之外的所有列表中的所有记录。如何做到这一点?


Tags: id列表objects记录filterlistmembershipqueryset
3条回答

我在这里看到了两个选择。

一。手动过滤(相当难看)

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')

自从Django 1.11以来,queryset在其他新方法中有一个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

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

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

set(alllists).difference(set(subscriptionlists))

相关问题 更多 >