title: how to handle multiple profiles per user?
body: <p>I'm doing something that doesn't feel very efficient. From my code below, you can probably see that I'm trying to allow for multiple profiles of different types attached to my custom user object (Person). One of those profiles will be considered a default and should have an accessor from the Person class. Storing an <code>is_default</code> field on the profile doesn't seem like it would be the best way to keep track of a default, is it?</p>
  
  <pre><code>from django.db import models
  from django.contrib.auth.models import User, UserManager
  
  
  class Person(User):
  
      public_name = models.CharField(max_length=24, default="Mr. T")
  
      objects = UserManager()
  
      def save(self):
          self.set_password(self.password)
          super(Person, self).save()
  
  
      def _getDefaultProfile(self):
  
          def_teacher = self.teacher_set.filter(default=True)
          if def_teacher: return def_teacher[0]
  
          def_student = self.student_set.filter(default=True)
          if def_student: return def_student[0]
  
          def_parent  = self.parent_set.filter(default=True)
          if def_parent:  return def_parent[0]
  
          return False
      profile = property(_getDefaultProfile)
  
  
      def _getProfiles(self):
          # Inefficient use of QuerySet here. Tolerated because the QuerySets should be very small.
          profiles = []
          if self.teacher_set.count(): profiles.append(list(self.teacher_set.all()))
          if self.student_set.count(): profiles.append(list(self.student_set.all()))
          if self.parent_set.count():  profiles.append(list(self.parent_set.all()))
  
          return profiles
      profiles = property(_getProfiles)
  
  
  
  
  class BaseProfile(models.Model):
  
      person = models.ForeignKey(Person)
      is_default = models.BooleanField(default=False)
  
      class Meta:
          abstract = True
  
  
  class Teacher(BaseProfile):
      user_type = models.CharField(max_length=7, default="teacher")
  
  
  class Student(BaseProfile):
      user_type = models.CharField(max_length=7, default="student")
  
  
  class Parent(BaseProfile):
      user_type = models.CharField(max_length=7, default="parent")
  </code></pre>