I was going through magic removal wiki page, and encountered this, I think there is still some magic left in the Custom managers, and multiple managers section. I have a following objections:
- finding the default manager based on the order in which they are defined
- manager instance magically contains self.model
I have the following suggestion:
people.py
#######################################################
from django.db import models
class PersonDoesNotExist(Exception): pass
class RDFPersonDoesNotExist(PersonDoesNotExist): pass
class Person(models.Model):
first_name = models.CharField(maxlength=30)
last_name = models.CharField(maxlength=30)
class PersonManager(models.Manager):
def get_fun_person(self):
try:
return self.get(fun=True)
except self.model.DoesNotExist :
print "Doesn't exist."
class RDFPersonManager(models.Manager): pass # for future
class LDAPPersonManager(models.Manager): pass
from django.settings import DATABASE_PROFILE2, LDAP_PROFILE
all = models.Manager(Person) # uses default django.settings.DATABASE_PROFILE
# raises ObjectDoesNotExist
fun_people = PersonManager(Person, settings = DATABASE2, exception = PersonDoesNotExist)
ladp_people = LDAPPersonManager(Person, settings = LDAP_PROFILE)
rdf_people = RDFPersonManager(Person, exception=RDFPersonDoesNotExist)
from django.contrib.admin import Admin
admin_db_people = Admin(all)
admin_db_people.list_display = ('first_name', 'last_name')
admin_db_people.register('People in Database') # no need for Admin class
admin_fun_people = Admin(fun_people)
admin_fun_people.register('Tall People in Database)
admin_ldap_people = Admin(ldap_people)
admin_ldap_people.register('LDAP Users')
################################################################
api usage:
from myproject.myapp.models import people
p = people.Person(first_name='amit', last_name='upadhyay')
p.save() # no default, raises ValueError: no manager specified
p.save(manager=people.tall_people) # or
people.all.save(p)
try: p_rdf = people.ldap_people.get (first_name='amit')
except people.RDFPersonDoesNotExist: pass
else:
p_rdf.first_name = 'Amit'
p_rdf.save() # person remembers where they came from
everyone = people.all() # all is a manager, which is callable
upadhyays = people.all.filter(last_name__iexact = 'upadhyay')
----------------------------------------------------------------------------------------
Cramming everything in a class will always force us to do some meta programming. Devoting a module and spreading things give better flexibility.
--
Amit Upadhyay
Blog: http://www.rootshell.be/~upadhyay
+91-9867-359-701