About Defining Many-to-many Through Model

When you need extra fields for a many-to-many relationship, you use the through model. In the through_fields attribute of many-to-many relation, the first field of should point to this model, and the second one should point to the other related model. For example,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=200)
    authors = models.CharField(max_length=200)

    def __str__(self):
        return self.title

class Reader(models.Model):
    name = models.CharField(max_length=200)
    reading_list = models.ManyToManyField(
        Book, through="BookToRead", through_fields=("reader", "book")
    )

    def __str__(self):
        return self.name

class BookToRead(models.Model):
    book = models.ForeignKey(Book, on_delete=models.CASCADE)
    reader = models.ForeignKey(Reader, on_delete=models.CASCADE)
    priority = models.PositiveIntegerField()
    added_date = models.DateTimeField()

    def __str__(self):
        return f"{self.reader} wants to read {self.book}"

Programming Development Databases Django 4.2 Django 3.2 Django 2.2