Skip to content

Instantly share code, notes, and snippets.

@bennylope
Created September 18, 2013 21:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bennylope/6616154 to your computer and use it in GitHub Desktop.
Save bennylope/6616154 to your computer and use it in GitHub Desktop.
Manager class example for working with generic keys. Keep content type lookups inside the manager.
from django.db import models
from django.contrib.contenttypes.models import ContentType
class BookmarkManager(models.Manager):
def _lookup_kwargs(self, **kwargs):
owner = kwargs.pop('owner', None)
if owner:
owner_type = ContentType.objects.get_for_model(owner)
owner_id = owner.id
kwargs.update(owner_type=owner_type, owner_id=owner_id)
item = kwargs.pop('item', None)
if item:
item_type = ContentType.objects.get_for_model(item)
item_id = item.id
kwargs.update(item_type=item_type, item_id=item_id)
return kwargs
def _create_kwargs(self, **kwargs):
owner = kwargs.pop('owner', None)
owner_id = kwargs.pop('owner_id', None)
owner_type = kwargs.pop('owner_type', None)
if owner:
owner_type = ContentType.objects.get_for_model(owner)
owner_id = owner.id
item = kwargs.pop('item', None)
item_id = kwargs.pop('item_id', None)
item_type = kwargs.pop('item_type', None)
if item:
item_type = ContentType.objects.get_for_model(item)
item_id = item.id
kwargs.update(owner_type=owner_type, owner_id=owner_id,
item_type=item_type, item_id=item_id)
return kwargs
def create(self, **kwargs):
clean_kwargs = self._create_kwargs(**kwargs)
return super(SavesManager, self).create(**clean_kwargs)
def get_or_create(self, **kwargs):
clean_kwargs = self._create_kwargs(**kwargs)
return super(SavesManager, self).get_or_create(**clean_kwargs)
def filter(self, **kwargs):
clean_kwargs = self._lookup_kwargs(**kwargs)
return super(SavesManager, self).filter(**clean_kwargs)
def get(self, **kwargs):
clean_kwargs = self._lookup_kwargs(**kwargs)
return super(SavesManager, self).get(**clean_kwargs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment