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?
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.
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
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With