Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I extend the Django Group model?

Is there a way to extend the built-in Django Group object to add additional attributes similar to the way you can extend a user object? With a user object, you can do the following:

class UserProfile(models.Model):     user = models.OneToOneField(User) 

and add the following to the settings.py file

AUTH_PROFILE_MODULE = 'app.UserProfile' 

which gets you:

profile = User.objects.get(id=1).get_profile() 

Is there any equivalent to this approach for extending a group? If not, is there an alternative approach I can take?

like image 333
Steve Platz Avatar asked Feb 02 '10 00:02

Steve Platz


People also ask

How do I override a Django model?

Whenever one tries to create an instance of a model either from admin interface or django shell, save() function is run. We can override save function before storing the data in the database to apply some constraint or fill some ready only fields like SlugField.


2 Answers

If you simply subclass the Group object then by default it will create a new database table and the admin site won't pick up any new fields.

You need to inject new fields into the existing Group:

if not hasattr(Group, 'parent'):     field = models.ForeignKey(Group, blank=True, null=True, related_name='children')     field.contribute_to_class(Group, 'parent') 

To add methods to the Group, subclass but tag the model as proxy:

class MyGroup(Group):      class Meta:         proxy = True      def myFunction(self):         return True 
like image 149
Semprini Avatar answered Oct 08 '22 11:10

Semprini


You can create a model that subclasses Group, add your own fields, and use a Model Manager to return any custom querysets you need. Here's a truncated example showing how I extended Group to represent Families associated with a school:

from django.contrib.auth.models import Group, User  class FamilyManager(models.Manager):     """     Lets us do querysets limited to families that have      currently enrolled students, e.g.:         Family.has_students.all()      """     def get_query_set(self):         return super(FamilyManager, self).get_query_set().filter(student__enrolled=True).distinct()   class Family(Group):     notes = models.TextField(blank=True)      # Two managers for this model - the first is default      # (so all families appear in the admin).     # The second is only invoked when we call      # Family.has_students.all()       objects = models.Manager()     has_students = FamilyManager()      class Meta:         verbose_name_plural = "Families"         ordering = ['name']      def __unicode__(self):         return self.name 
like image 35
shacker Avatar answered Oct 08 '22 12:10

shacker