﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
33209	ManyToManyField.add() doesn't respect a unique constraint in intermediate table	Yuta Okamoto	nobody	"I added the following `Company` and `Member` models, and `CompanyMember` as their intermediate table with a unique constraint including `role` field in addition to `through_fields`.

{{{#!python
from django.db import models

class Company(models.Model):
    pass

class Member(models.Model):
    companies = models.ManyToManyField(Company, through='CompanyMember', related_name='members')

class CompanyMember:
    company = models.ForeignKey(Company, on_delete=models.CASCADE)
    member = models.ForeignKey(Member, on_delete=models.CASCADE)
    role = models.SmallIntegerField()

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['company', 'member', 'role'], name='company_member_role'),
        ]
}}}

In this situation, `company.members.add()` fails to add existing member with different role.

{{{#!python
company = Company.objects.create()
member = Member.objects.create()

company.members.add(member, through_defaults={'role': 1})
assert Company.objects.all().count() == 1

company.members.add(member, through_defaults={'role': 2})
assert Company.objects.all().count() == 2  # fails
}}}

We need to workaround by adding the relation to the intermediate table directly.

{{{#!python
company.members.through.objects.create(
    company.members.through(company=company, member=member, role=2)
)
}}}
"	Bug	new	Database layer (models, ORM)	3.1	Normal				Unreviewed	0	0	0	0	0	0
