自定义管理器正在返回所有对象 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()
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()