Django Models - One to Many or Many o Many

In Django there are no One-to-Many relationships, there are just Many-to-One. In cases where defining Foreign Key on the child table is odd, should we go for Many-to-Many?

For example:

Book has many pages. If we define foreign key on the Page model, then the page has one book which is not an intuitive thing to do (or say).

OPTION 1:

class Book(models.Model):
    name = models.CharField(max_length=100)
    date_published = models.DateTimeField(default=timezone.now)


class Page(models.Model):
   page_number = models.IntegerField()
   page_text = RichTextField()
   book = models.ForeignKey(Book, on_delete=models.CASCADE)

OPTION 2

class Book(models.Model):
    name = models.CharField(max_length=100)
    date_published = models.DateTimeField(default=timezone.now)
    pages = models.ManytoMany(Page)


class Page(models.Model):
   page_number = models.IntegerField()
   page_text = RichTextField()

In option2 I can access the pages of the book by book.pages.

In option 1 I don't know how to access the pages, maybe book.pages_set.objects.all() which is not pretty.

I asked a fellow programmer and he said just use Many-to-Many. I understand what each approach means and I also understand the difference between the two as to what's happening in the database. My question is what is a better/standard approach.


Solution 1:

I prefare the first option because many books doesn't have common page and its contains. So, using first option you can access book pages using following queryset

pages = book.page_set.all()

Here, you can also use related_name parameter in foreignkey field as:

book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name="pages")

then book pages can be fetched using

pages = book.pages.all()