自定义管理器正在返回所有对象 django.11 postgres

custom manager is returning all the objects django.11 postgres

class CustomManager(models.Manager):
    def get_query_set(self):
        queryset = super(CustomManager, self).get_query_set()
        return queryset.filter(
            models.Q(expiration_date__gte=datetime.date.today()) |
            models.Q(
                expiration_date__gte=datetime.date.today() - datetime.timedelta(days=40),
                is_invoice_emailed=True
            )
        )

class Subscription(models.Model):
      ....
      objects = CustomManager()
      default = models.Manager()

当我访问 Subscription.objects.all() 时,它返回数据库中的所有记录而不进行过滤。但是,如果我使用下面的查询

queryset = Subscription.objects.all()
queryset.filter(
                models.Q(expiration_date__gte=datetime.date.today()) |
                models.Q(
                    expiration_date__gte=datetime.date.today() - datetime.timedelta(days=40),
                    is_invoice_emailed=True
                )
            )

它正在返回过滤后的结果。为什么?

我正在使用 django==1.11.11,python2.7 和 db Postgresql

请帮忙。谢谢

管理器上的all() 方法只是委托给get_queryset(),它被设计为return dB 上的所有对象。 如果您要使用像 filter() 或 exclude() 这样的过滤方法,您将已经拥有 QuerySet,并且它 return 与过滤条件匹配的特定对象。 你可以了解查询集 django queryset documentation here

您的 get_query_set() 方法应输入 get_queryset()

您也可以直接使用 QuerySet 而不是 Manager:

class CustomQuerySet(models.QuerySet):

    def get_result(self):
        return self.filter(
            models.Q(expiration_date__gte=datetime.date.today()) |
            models.Q(
                expiration_date__gte=datetime.date.today() - datetime.timedelta(days=40),
                is_invoice_emailed=True
            )
        )

class Subscription(models.Model):

    ...

    objects = CustomQuerySet().as_manager()

以上优点是您不再需要提供经理class。

从现在开始,您可以像这样使用它:Subscription.objects.get_result()