Hi,

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:

Put each model in a seperate module [in the myproject.myapp.models directory].

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

Reply via email to