Performance: Through model for extra fields on M2M
This affects database query performance and page load speed by adding complexity to many-to-many relationships with extra fields.
Jump into concepts and practice - no test required
class BookAuthor(models.Model): book = models.ForeignKey('Book', on_delete=models.CASCADE) author = models.ForeignKey('Author', on_delete=models.CASCADE) contribution = models.CharField(max_length=100) class Book(models.Model): authors = models.ManyToManyField('Author', through='BookAuthor')
class Book(models.Model): authors = models.ManyToManyField('Author') # Storing extra info in a separate model and querying manually
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| No through model, manual extra data handling | Multiple queries increase DOM update delays | Multiple reflows due to incremental data | Higher paint cost due to delayed data | [X] Bad |
| Through model with optimized queries | Single query with joins reduces DOM delays | Single reflow after data load | Lower paint cost with faster data | [OK] Good |
through model in a Django many-to-many relationship?Membership in Django when the Membership model is defined later?print(membership.role) output?class Group(models.Model):
name = models.CharField(max_length=100)
class User(models.Model):
username = models.CharField(max_length=100)
class Membership(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
role = models.CharField(max_length=50)
# Usage
user = User(username='alice')
user.save()
group = Group(name='Developers')
group.save()
membership = Membership(user=user, group=group, role='admin')
membership.save()
print(membership.role)class User(models.Model):
username = models.CharField(max_length=100)
class Membership(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
group = models.ForeignKey('Group', on_delete=models.CASCADE)
role = models.CharField(max_length=50)
class Group(models.Model):
name = models.CharField(max_length=100)
members = models.ManyToManyField(User, through='Membership')