Джанго: Получение дополнения к набору запросов - PullRequest
6 голосов
/ 11 января 2012

Я получаю набор запросов для определенной модели, и я хотел бы получить его дополнение, то есть все экземпляры этой модели, которые не в вышеупомянутом наборе запросов.

Как я могу это сделать?

1 Ответ

11 голосов
/ 11 января 2012

Краткое решение

qs = Model.objects.filter(...) # qs with objects to exclude
result = Model.objects.exclude(pk__in=qs.values_list('pk', flat=True))

Больше СУХОГО решения

Однако если вы хотите использовать логику много раз, я бы предложилинкапсулировать это в методе.Вот пример, который я лично использовал в пользовательском наборе запросов:

class QuerysetUtils:
    def get_queryset_complement(self, method):
        return self.exclude(pk__in=method().values_list('pk', flat=True))


class ExpirableQueryset(QuerysetUtils, models.query.QuerySet):
    def expired(self):
        return self.filter(expiration__lte=timezone.now())

    def unexpired(self):
        return self.get_queryset_complement(self.expired)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...