The straight-forward way to do this with a relational database is to create an intermediary table (as Django does automatically with ManyToManyField) and then add fields to that table. Setting up this structure in Django is also straight-forward, but it took some work for me to find the right Field arguments to make it all work as I'd like on the admin side. Here's how I did it: {{{ from django.db import models class Individual (models.Model): #... class Admin: pass class Event (models.Model): #... class Admin: pass class Participation (models.Model): # leave defaults: null=False , core=False event = models.ForeignKey(Event, related_name='participants', edit_inline=True, blank=True, default=None) individual = models.ForeignKey(Individual, related_name='events', edit_inline=True, blank=True, default=None) # set core=True and blank=True: now admin will show it blank by default (so it won't exist unless you specify something) role = models.PositiveSmallIntegerField(core=True, blank=True, default=None) class Admin: pass }}}