Consider a Django many-to-many relationship with a through model that adds an extra field date_joined. What will be the output of the following code snippet?
class Membership(models.Model): person = models.ForeignKey('Person', on_delete=models.CASCADE) group = models.ForeignKey('Group', on_delete=models.CASCADE) date_joined = models.DateField() class Person(models.Model): name = models.CharField(max_length=100) groups = models.ManyToManyField('Group', through='Membership') class Group(models.Model): name = models.CharField(max_length=100) # Assume we have a person instance and group instance linked via Membership membership = Membership.objects.get(person=person_instance, group=group_instance) print(membership.date_joined)
Remember that the through model stores extra fields and can be queried directly.
The through model Membership holds the extra field date_joined. Accessing it via the Membership instance returns the stored date.
Given the following models with a through model Membership that has an extra field role, what is the number of Membership records after executing the code below?
person = Person.objects.create(name='Alice') group = Group.objects.create(name='Developers') Membership.objects.create(person=person, group=group, role='admin') print(Membership.objects.count())
Creating a Membership instance adds one record.
Each call to Membership.objects.create() adds one record. Here, one record is created.
Given the models below, why does the code person.groups.add(group_instance) raise an error?
class Membership(models.Model): person = models.ForeignKey('Person', on_delete=models.CASCADE) group = models.ForeignKey('Group', on_delete=models.CASCADE) date_joined = models.DateField() class Person(models.Model): name = models.CharField(max_length=100) groups = models.ManyToManyField('Group', through='Membership') class Group(models.Model): name = models.CharField(max_length=100) person = Person.objects.create(name='Bob') group_instance = Group.objects.create(name='Admins') person.groups.add(group_instance)
Think about how Django handles many-to-many relations with extra fields.
When a through model has extra fields, you cannot use add() directly because Django doesn't know how to fill those extra fields. You must create the through model instance manually.
Choose the correct Django model code that defines a many-to-many relationship with a through model containing an extra field status.
Remember that ForeignKey fields in the through model require on_delete argument.
Option D correctly uses ForeignKey with on_delete=models.CASCADE and defines the ManyToManyField with through='Membership'. Option D incorrectly uses ManyToManyField inside the through model. Option D misses on_delete. Option D misses the through argument.
Why would a developer choose to use a through model with extra fields instead of a simple ManyToManyField without a through model?
Think about what extra fields in the through model represent.
The main advantage is to store extra data about the relationship itself, like when it was created or the role of the related object, which is not possible with a simple ManyToManyField.