Reputation: 11705
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()
when I access Subscription.objects.all()
it's returning all the records in db without filtering. but, If I use below query
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
)
)
It is returning filtered results. Why?
I'm using django==1.11.11, python2.7 and db Postgresql
Please help. Thanks.
Upvotes: 0
Views: 47
Reputation: 1238
Your get_query_set()
method should be typed like get_queryset()
You may also use QuerySet directly instead of 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()
The pros of above is that you no longer have to provide Manager class.
From now you can use it like: Subscription.objects.get_result()
Upvotes: 1
Reputation: 28
The method all() on a manager just delegates to get_queryset(), and it is design to return all the objects on dB. If you would use a filter method like filter() or exclude(), you would already have the QuerySet, and it return certain object which matches the condition of filter. You can learn about queryset on django queryset documentation here
Upvotes: 0