related_name controls the attribute Django adds to the referenced object for traversing a reverse relationship. Without it, a Venue reached through Room.venue exposes rooms as venue.room_set; related_name="my_rooms" changes that attribute to venue.my_rooms. section 4.7.1
Use the option deliberately:
- Keep the default when it is clear; renaming without a good reason can confuse maintainers. section 4.7.1
- Choose distinct names when a model has two ForeignKey relationships to the same target. section 4.7.1
- Set related_name="+" to disable the reverse relationship when that is useful for efficiency. section 4.7.1
Naming a venue's rooms
With Room.venue = models.ForeignKey(Venue, on_delete=models.CASCADE, related_name="my_rooms"), code can retrieve a venue's rooms with venue.my_rooms.all() instead of venue.room_set.all(). The manager supports the same kinds of queries as .objects, but limits results to related Room objects. section 4.7.1
Listing 4.13 Venue and Room models and their one-to-many relationship
# RiffMates/bands/models.py
...
class Venue(models.Model):
name = models.CharField(max_length=20)
def __str__(self):
return f"Venue(id={self.id}, name={self.name})"
class Room(models.Model):
name = models.CharField(max_length=20)
venue = models.ForeignKey(Venue, on_delete=models.CASCADE) #1
def __str__(self):
return f"Room(id={self.id}, name={self.name})"
Inspect the Venue and Room ForeignKey that creates the default reverse room_set manager. section 4.7.1
