I'm working on a Django project that tracks arts-related activities, and I'm stuck on the human-resources part of things.
(code below) I have a class
Ensemble that subclasses
Organization only has one important field,
Ensemble has another field,
players (a many to many relationship). A player is a
Performer which has two foreign key fields,
instrument. The idea is that a performer is any individual on a particular instrument--so, e.g., I can be one individual that can be two performers: one on guitar, the other on bass.
The problem is that not all
organizations are as clean as this. Some
Organizations will have dancers, for instance (a dance troup), plus any number of generic
Individuals who do any number of specific tasks not tracked as a specific class (like
Performer). So at first I was thinking it would be best to just map
Individuals to the
Organization through a many to many relationship, create a
Job class mapping
Individuals to a
JobCode class (which might include a row with something like 'performer'), but that doesn't work well if for instance you want to keep track of which instrument a performer plays for that particular ensemble, or if they play multiple instruments, I would like to be able to make that explicit. That's why the
Ensemble::players relationship made sense to me.
So it seems I have an
Organization class that will never truly be more than abstract, but I still need to be able to track what type of job an
individual does for an
Ensemble only makes sense for mapping
Performers to an
Organization, but what about
Teachers in a
School? Again, I would like to be able to make it explicit that a bassoon player is teaching bassoon at the school, and not clarinet (even though they might play both). So I can't just map the
Individual to the
School organization, right?
Also, this seems like it would be a common problem. Is there a conventional way of dealing with these kinds of relationships? What is the most effective?
class Individual(models.Model): surname = models.CharField(max_length=255) name = models.CharField(max_length=255) prefix = models.ForeignKey(Prefix, blank=True, null=True) suffix = models.ManyToManyField(Suffix, blank=True) date_of_birth = models.DateField(null=True, blank=True) phone_numbers = models.ManyToManyField(PhoneNumber, blank=True) addresses = models.ManyToManyField(Address, blank=True) user = models.OneToOneField(User, blank=True, null=True) class Performer(models.Model): individual = models.ForeignKey(Individual) instrument = models.ForeignKey(Instrument) class Organization(models.Model): name = models.CharField(max_length=255) founded = models.DateField() tags = TaggableManager(blank=True) media = models.ManyToManyField(Upload, blank=True) class Ensemble(Organization): players = models.ManyToManyField(Performer)