Django:获取查询集的补充

时间:2012-01-11 13:31:30

标签: python django orm

我得到某个模型的查询集,我想得到它的补充,即上述查询集中的那个模型的所有实例。

我该怎么做?

1 个答案:

答案 0 :(得分:11)

简短解决方案

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

更多DRY解决方案

但是,如果你想多次使用逻辑,我建议将其封装在一个方法中。以下是我个人在自定义查询集中使用的示例:

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)