Represent One to Many Relationship in Django

  1. Represent One to Many Relationship using a Junction / Intermediatory Model
  2. Represent One to Many Relationships using Foreign Keys

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.

Contribute
DelftStack is a collective effort contributed by software geeks like you. If you like the article and would like to contribute to DelftStack by writing paid articles, you can check the write for us page.