Django:获取查询集的补充

Ram*_*hum 7 python django orm

我得到一个特定模型的查询集,我想得到它的补充,即该模型的所有实例都不在上述查询集中.

我怎样才能做到这一点?

Ber*_*ant 12

简短解决方案

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

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

  • 请注意,这将作为子查询执行,即永远不会生成要排除的所有ID的列表(否则会产生潜在的性能损失) (2认同)
  • 这是最简洁的解决方案吗? (2认同)