text: from djmodels.contrib.auth.models import User
  from djmodels.db import models
  
  
  # Forward declared intermediate model
  class Membership(models.Model):
      person = models.ForeignKey('Person', models.CASCADE)
      group = models.ForeignKey('Group', models.CASCADE)
      price = models.IntegerField(default=100)
  
      def __str__(self):
          return "%s is a member of %s" % (self.person.name, self.group.name)
  
  
  # using custom id column to test ticket #11107
  class UserMembership(models.Model):
      id = models.AutoField(db_column='usermembership_id', primary_key=True)
      user = models.ForeignKey(User, models.CASCADE)
      group = models.ForeignKey('Group', models.CASCADE)
      price = models.IntegerField(default=100)
  
      def __str__(self):
          return "%s is a user and member of %s" % (self.user.username, self.group.name)
  
  
  class Person(models.Model):
      name = models.CharField(max_length=128)
  
      def __str__(self):
          return self.name
  
  
  class Group(models.Model):
      name = models.CharField(max_length=128)
      # Membership object defined as a class
      members = models.ManyToManyField(Person, through=Membership)
      user_members = models.ManyToManyField(User, through='UserMembership')
  
      def __str__(self):
          return self.name
  
  
  # Using to_field on the through model
  class Car(models.Model):
      make = models.CharField(max_length=20, unique=True, null=True)
      drivers = models.ManyToManyField('Driver', through='CarDriver')
  
      def __str__(self):
          return "%s" % self.make
  
  
  class Driver(models.Model):
      name = models.CharField(max_length=20, unique=True, null=True)
  
      def __str__(self):
          return "%s" % self.name
  
      class Meta:
          ordering = ('name',)
  
  
  class CarDriver(models.Model):
      car = models.ForeignKey('Car', models.CASCADE, to_field='make')
      driver = models.ForeignKey('Driver', models.CASCADE, to_field='name')
  
      def __str__(self):
          return "pk=%s car=%s driver=%s" % (str(self.pk), self.car, self.driver)
  
  
  # Through models using multi-table inheritance
  class Event(models.Model):
      name = models.CharField(max_length=50, unique=True)
      people = models.ManyToManyField('Person', through='IndividualCompetitor')
      special_people = models.ManyToManyField(
          'Person',
          through='ProxiedIndividualCompetitor',
          related_name='special_event_set',
      )
      teams = models.ManyToManyField('Group', through='CompetingTeam')
  
  
  class Competitor(models.Model):
      event = models.ForeignKey(Event, models.CASCADE)
  
  
  class IndividualCompetitor(Competitor):
      person = models.ForeignKey(Person, models.CASCADE)
  
  
  class CompetingTeam(Competitor):
      team = models.ForeignKey(Group, models.CASCADE)
  
  
  class ProxiedIndividualCompetitor(IndividualCompetitor):
      class Meta:
          proxy = True
  