#27249: IntegrityError when using ManyToManyField.add due to type confusion -------------------------------------+------------------------------------- Reporter: sjoerdjob | Owner: nobody Type: Uncategorized | Status: new Component: Database layer | Version: master (models, ORM) | Keywords: manytomanyfield, Severity: Normal | integrityerror Triage Stage: Unreviewed | Has patch: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+------------------------------------- When specifying the primary keys of objects to `related_manager.add`, one has to use the same type as the database returns, at the risk of getting an `IntegrityError`.
Example (using Django contrib.auth). {{{ >>> from django.contrib.auth.models import Group, Permission >>> group = Group.objects.create() >>> permission = Permission.objects.first() >>> print(permission.pk) 1 >>> group.permissions.add(permission.pk) >>> group.permissions.add(permission.pk) >>> group.permissions.add(str(permission.pk)) Traceback (most recent call last): ... <snip> ... IntegrityError: UNIQUE constraint failed: auth_group_permissions.group_id, auth_group_permissions.permission_id >>> group.permissions.add(permission.pk) >>> group.permissions.add(permission.pk) }}} Now of course, I assume nobody would do an explicit call to `str()` there, but if the primary keys come from another input source (like: a URL), it is not unlikely to expect them to not be the same type as the database uses. (seen in 1.9.6, 1.10.1 and master). Not sure about how to fix it, because the type of the primary key might not necessarily be an integer. -- Ticket URL: <https://code.djangoproject.com/ticket/27249> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/052.deda989fe0cfc652d25330ac25634934%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.