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
请帮忙。感谢。
答案 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