How to create a triple-join table with Django How to create a triple-join table with Django django django

How to create a triple-join table with Django


zacherates writes:

I'd model Role as an association class between Users and Roles (...)

I'd also reccomed this solution, but you can also make use of some syntactical sugar provided by Django: ManyToMany relation with extra fields.

Example:

class User(models.Model):    name = models.CharField(max_length=128)class Event(models.Model):    name = models.CharField(max_length=128)    members = models.ManyToManyField(User, through='Role')    def __unicode__(self):        return self.nameclass Role(models.Model):    person = models.ForeignKey(User)    group = models.ForeignKey(Event)    date_joined = models.DateField()    invite_reason = models.CharField(max_length=64)


I'd recommend just creating an entirely separate model for this.

class Assignment(Model):    user = ForeignKey(User)    role = ForeignKey(Role)    event = ForeignKey(Event)

This lets you do all the usual model stuff, such as

user.assignment_set.filter(role__name="Chaperon")role.assignment_set.filter(event__name="Silly Walkathon")

The only thing left is to enforce your one-role-per-user-per-event restriction. You can do this in the Assignment class by either overriding the save method (http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods) or using signals (http://docs.djangoproject.com/en/dev/topics/signals/)


I'd model Role as an association class between Users and Roles, thus,

class User(models.Model):     ...class Event(models.Model):     ...class Role(models.Model):     user = models.ForeignKey(User)     event = models.ForeignKey(Event)

And enforce the one role per user per event in either a manager or SQL constraints.