Stop writing Django querysets.
Project description
A Django utility that makes it simple to write DRY queryset methods.
Warning
This project has been superceded by QuerySet.as_manager(). See the docs.
Usage
Create a manager class that inherit the QuerySetManager
Decorate your filter methods with queryset_method. These methods receive a queryset instead of a manager as the first argument.
from dj_queryset_manager import QuerySetManager, queryset_method
class MyManager(QuerySetManager):
@queryset_method
def by_slug(queryset, slug):
return queryset.filter(slug=slug)
@queryset_method
def filter(queryset, *args, **kwargs):
return super(type(queryset), queryset).filter(*args, **kwargs)
For reference, here is a standard implementation:
from django.db.models import Manager
from django.db.models.query import QuerySet
class MyQuerySet(QuerySet):
def by_slug(self, slug):
return self.filter(slug=slug)
def filter(self, *args, **kwargs):
return super(MyQuerySet, self).filter(*args, **kwargs)
class MyManager(Manager):
def get_query_set(self): # Better remember the arguments to QuerySet
QuerySet(self.model, using=self._db)
def get_queryset(self): # And don't forget about Django 1.6
return self.get_query_set()
def by_slug(self, *args, **kwargs): # Enjoy this duplicate signature
return self.get_queryset().filter(*args, **kwargs)
Mix-in
Some third-party apps ship managers as part of their API. If you need to extend any existing manager, use the QuerySetManagerMixin. This example uses the InheritanceManager from django-model-utils.
from model_utils.managers import InheritanceManager
from dj_queryset_manager import QuerySetManagerMixin, queryset_method
class MyInheritanceManager(QuerySetManagerMixin, InheritanceManager):
@queryset_method
def by_slug(queryset, slug):
return queryset.filter(slug=slug)
Planned Obsolescence
This project will be partially obsoleted by Django 1.7, when you can do this:
from django.db.models import Manager
from django.db.models.query import QuerySet
class MyQuerySet(QuerySet):
def by_slug(self, slug):
return queryset.filter(slug=slug)
MyManager = Manager.from_queryset(MyQuerySet)
However, if you still need to extend existing managers, or you don’t want to worry about the upgrade path from Manager.get_query_set to Manager.get_queryset in your own code, you may want to stick with this package.
Installation
$ pip install dj-queryset-manager
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Hashes for dj-queryset-manager-0.1.2.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 883832968c92adccfdb760c2603a18385a7e3af5a4e52150a8dba712f21c520d |
|
MD5 | 6c4448146b8d881ffb95d92c86b9086a |
|
BLAKE2b-256 | 2724d8a13e549bb677cc73d80394e9c86dc7ca0042c9fd543ff400abb86e6809 |