How to Represent One to Many Relationship in Django

Vaibhav Vaibhav Feb 02, 2024
  1. Represent One to Many Relationship using a Junction / Intermediatory Model
  2. Represent One to Many Relationships using Foreign Keys
How to Represent One to Many Relationship in Django

Databases play a key role almost everywhere, and it’s no surprise that web development is one such place. Building tables and setting up relationships between tables using SQL is a simple task, but Django makes it even simpler.

This article will introduce how to represent one to many relationships in Django.

Represent One to Many Relationship using a Junction / Intermediatory Model

Refer to the following models’ definitions.

class Number(models.Model):
    number = models.CharField(max_length=10)


class Person(models.Model):
    name = models.CharField(max_length=200)


class PersonNumber(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="numbers")
    number = models.ForeignKey(Number, on_delete=models.CASCADE, related_name="person")

The Number model has a field number to store a phone number.

The Person model has a field name for the person’s name.

PersonNumber is a junction or intermediatory model for Number and Person. The foreign keys have a cascading relationship with the referred objects. This model can be used to set up a one-to-many relationship as well as a many-to-many relationship.

The default primary key for all the models is id, an integer auto-field.

Since a phone number is only associated with a single person, but a person can have more than one phone number, this is a one-to-many relationship. PersonNumber will be used to represent this relationship.

If a variable person is storing a Person object, we can easily access all the phone numbers of this person using the following statement.

numbers = person.numbers.objects.all()

This statement will return a QuerySet of Number objects.

Consider this example.

ID Person Number
1 1 1
2 1 2
3 1 3
4 1 4
5 2 5
6 2 6
7 3 7

A person with id 1 has four phone numbers with id 1, 2, 3, and 4.
A person with id 2 has two phone numbers with id 5, and 6.
A person with id 3 has only one phone number with id 7.

Represent One to Many Relationships using Foreign Keys

Refer to the following models’ definitions.

class Person(models.Model):
    name = models.CharField(max_length=200)


class Number(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    number = models.CharField(max_length=10)

The Person model has a field name for the person’s name.

The Number model has a field number to store a phone number and a foreign key reference to the Person model. This field would store the owner of this number. The foreign key has a cascading relationship with the referenced model, Person.

Using this structure, we can easily associate each Number object with its respective owner using the foreign key reference.

If a variable person is storing a Person object, we can access all the numbers associated with this person using the following statement.

numbers = Number.objects.filter(person=person)

This statement will return a QuerySet of Number objects.

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.