In relational database design, a Many-to-Many relationship occurs when multiple records in one table relate to multiple records in another table (e.g. Authors writing multiple Books, and Books having multiple Authors). Django ORM simplifies this via models.ManyToManyField().

Django Model Definition (with Intermediate through Model)

models.pypython
from django.db import models
 
class Developer(models.Model):
    name = models.CharField(max_length=100)
 
    def __str__(self):
        return self.name
 
class Project(models.Model):
    title = models.CharField(max_length=200)
    # Define Many-to-Many relationship using a custom through join model
    developers = models.ManyToManyField(Developer, through='Membership')
 
    def __str__(self):
        return self.title
 
class Membership(models.Model):
    developer = models.ForeignKey(Developer, on_delete=models.CASCADE)
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    date_joined = models.DateField(auto_now_add=True)
    role = models.CharField(max_length=50, default='Contributor')
queries.pypython
# Prevent N+1 SQL queries by prefetching many-to-many relationship data
projects = Project.objects.prefetch_related('developers').all()
 
for project in projects:
    print(f"Project: {project.title}")
    for dev in project.developers.all():
        print(f"  - Dev: {dev.name}")