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

时间:2018-03-20 08:09:27

标签: django postgresql python-2.7 django-managers

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()时,它会在db中返回所有记录而不进行过滤。但是,如果我使用下面的查询

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

请帮忙。感谢。

2 个答案:

答案 0 :(得分:1)

您的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()

上述优点是您不再需要提供Manager类。

从现在起,您可以像Subscription.objects.get_result()

一样使用它

答案 1 :(得分:0)

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