#129 closed defect (fixed)
Multiple ManyToManyField fields with same "to" reference tries to create duplicate tables
| Reported by: | Owned by: | Adrian Holovaty | |
|---|---|---|---|
| Component: | Metasystem | Version: | |
| Severity: | normal | Keywords: | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | no | Needs documentation: | no | 
| Needs tests: | no | Patch needs improvement: | no | 
| Easy pickings: | no | UI/UX: | no | 
Description
Revsion 257 added support for adding multiple ManyToManyField fields with the same "to" class on the same class. I've tried adding two fields where one has an explicit rel_name option but running "django-admin.py sql myapp" is showing two CREATE TABLE statements with the same table name.
I think I've tracked the problem down to the get_m2m_db_table method in the ManyToManyField class in core/meta.py but I don't understand the code base enough yet to try to fix it.
It looks like the code is returning the name as myapp_fromname_toname but I'd expect the name of the many-to-many table to be myapp_relname when the rel_name option is specified.
I'm using the MySQL database engine but I don't think that has any bearing on this problem.
Change History (5)
comment:1 by , 20 years ago
| Resolution: | → worksforme | 
|---|---|
| Status: | new → closed | 
comment:2 by , 20 years ago
| Resolution: | worksforme | 
|---|---|
| Status: | closed → reopened | 
Using your example, I was able to get it to work. Setting rel_name and related_name doesn't have any effect on the generated table name. Setting name does have an affect on the table name, though.
I reopened the ticket just to confirm that this is what you intended since it conflicts with your comment.
comment:3 by , 20 years ago
| Status: | reopened → new | 
|---|
comment:4 by , 20 years ago
| Status: | new → assigned | 
|---|
comment:5 by , 20 years ago
| Resolution: | → fixed | 
|---|---|
| Status: | assigned → closed | 
I believe this is fixed in the new trunk.
The docs are sketchy on this, but the solution is to set
rel_nameandrelated_name.Example:
meta.ManyToManyField(Category, verbose_name="Categories to include"), meta.ManyToManyField(Category, name="excluded_categories", rel_name="excluded_category", related_name='excluded_section', verbose_name="Categories to exclude"),