Как получить разницу между двумя запросами в Django

У меня есть запрос. alllists и подписные листы

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

Мне нужен запрос, называемый unsubscriptionlist, который имеет все записи в alllists, кроме записей в списках подписки. Как достичь этого. Я googled, но это тоже не сработало. Пожалуйста, помогите

Ответ 1

Вы можете использовать разницу в настройках, чтобы помочь:

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

Ответ 2

Ну, я вижу здесь два варианта.

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

Ответ 3

Как насчет:

subscriptionlists = Membership.objects.filter(member__id=memberid, datamode='A')
unsubscriptionlists = Membership.objects.exclude(member__id=memberid, datamode='A')

Списки запрещенных подписей должны быть обратными спискам подписки.

Ответ Брайана также будет работать, хотя set() скорее всего оценит запрос и будет оценивать производительность при оценке обоих наборов в памяти. Этот метод будет поддерживать ленивую инициализацию, пока вам не понадобятся данные.